Saya ingin mencetak kolom atau kolom terakhir kedua dalam awk. Jumlah bidang adalah variabel. Saya tahu bahwa saya harus bisa menggunakan $NF
tetapi tidak yakin bagaimana itu bisa digunakan.
Dan ini sepertinya tidak berhasil:
awk ' { print ( $NF-- ) } '
NF
adalah indeks bidang terakhir,$NF
adalah nilai bidang terakhirJawaban:
Harus bekerja
sumber
awk -F '.' '{print $(NF-2)}'
$(..)
memanggil perintah dalam subkulit tergantung pada shell yang Anda gunakan. Anda dapat mengatasi ini dengan menggunakan$ (NF-1)
alih-alih$(NF-1)
.Tambahan kecil untuk jawaban yang diterima Chris Kannon: hanya mencetak jika sebenarnya ada kolom terakhir kedua.
sumber
Ini paling sederhana:
Alasan yang asli
$NF--
tidak berfungsi adalah karena ekspresi dievaluasi sebelum pengurangan, sedangkan pengurangan awalan saya dilakukan sebelum evaluasi.sumber
int x = ++i
int x = i++
, Awalan berarti kenaikan pertama; postfix berarti kenaikan nanti (penugasan pertama).sumber
Anda tidak jauh dari hasilnya! Ini melakukannya:
Ini mengurangi jumlah bidang dalam satu, sehingga
$NF
berisi yang kedua dari belakang.Uji
Mari kita menghasilkan beberapa angka dan mencetaknya di grup 5:
Mari kita cetak kedua dari belakang di setiap baris:
sumber
Solusi Perl mirip dengan solusi awk Chris Kannon:
Opsi baris perintah ini digunakan:
n
lingkaran di sekitar setiap baris dari file input, jangan otomatis mencetak setiap barisl
menghapus baris baru sebelum diproses, dan menambahkannya kembali sesudahnyaa
mode autosplit - membagi jalur input ke dalam@F
array. Default untuk memisahkan di whitespacee
jalankan kode perlThe
@F
autosplit Array dimulai pada index [0] sedangkan bidang awk mulai dengan $ 1.$#F
adalah jumlah elemen dalam@F
sumber
$F[-2]
Apakah Anda mencoba memulai dari kanan ke kiri dengan menggunakan perintah rev? Dalam hal ini Anda hanya perlu mencetak kolom ke-2:
sumber
Pertama-tama, kurangi nilainya dan kemudian cetak -
ATAU
sumber
Jika Anda memiliki banyak kolom dan ingin mencetak semua tetapi tidak tiga kolom terakhir, maka ini mungkin membantu
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
sumber