Bagaimana cara memotong (memilih) bidang dari penghitungan baris teks dari akhir?


32

Saya tahu cara memilih bidang dari garis menggunakan perintah cut. Misalnya, diberikan data berikut:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

Perintah ini:

cut -d, -f2 # returns the second field of the input line

Pengembalian:

b
g
l

Pertanyaan saya: Bagaimana saya bisa memilih penghitungan kolom kedua dari akhir? Pada contoh sebelumnya, hasilnya adalah:

d
i
n

Jawaban:


52

Balikkan input sebelum dan sesudah cutdengan rev:

<infile rev | cut -d, -f2 | rev

Keluaran:

d
i
n

1
Saya memiliki banyak cuplikan kecil di folder tempat sampah saya. rcut tepat untuk ini: #! / bin / bash rev | potong "$ @" | rev
John Allsup

2
Sayang sekali cuttidak dapat mengambil indeks bidang negatif (seperti Python).
Keith Devens

10

Coba lakukan ini dengan :

awk -F, '{print $(NF-1)}' file.txt

Atau menggunakan :

perl -F, -lane 'print $F[-2]' file.txt

Atau menggunakan (terima kasih manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

Atau menggunakan bash(terima kasih manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

Atau menggunakan :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashtidak perlu menghitung kolom tetap untuk ini: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
manatwork

1
BTW, solusi ketiga Anda juga bekerja jika Anda mengubah perldengan ruby.
manatwork

Terima kasih, rubytambah, bashedit.
Gilles Quenot

1
Jika bidang ke-4 dapat dimulai dengan -atau (tergantung pada lingkungan, shell, atau bagaimana shell dikompilasi), mungkin berisi karakter backslash, maka echoitu bukan opsi. Mengapa Anda perlu catberhimpun file.txtdengan apa pun sebelum menyuapkannya python? Anda perlu read -Abukannya read -adi ksh93dan zsh. Subskrip negatif berfungsi zshtetapi hanya dalam versi ksh93dan terbaru bash. Dalam versi yang lebih lama, Anda dapat menggunakan${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, saya pikir maksud Anda ${d[@]: -2:1}dalam kalimat terakhir Anda.
manatwork

0

Menggunakan sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

Keluaran:

d
i
n

Penjelasan

  • ([^,]*,)* cocok dengan sejumlah charecter non-koma diikuti oleh koma, yaitu sejumlah kolom.
  • ([^,]*) cocok dengan kolom.
  • (,[^,]*){1}cocok dengan satu kolom di bagian akhir, jika Anda mengubah kuantifier {1}ke {2}cocok dengan kolom kedua dari ujung dll.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.