Yang saya inginkan hanyalah dua kolom terakhir yang dicetak.
Yang saya inginkan hanyalah dua kolom terakhir yang dicetak.
Jawaban:
Anda dapat menggunakan variabel NF
yang diatur ke jumlah total bidang dalam catatan masukan:
awk '{print $(NF-1),"\t",$NF}' file
ini mengasumsikan bahwa Anda memiliki setidaknya 2 bidang.
awk '{print $(NF-1) "\t" $NF}' file
atau awk '{print $(NF-1), $NF}' file
atau awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
adalah awk menafsirkan setiap variabel yang dipisahkan koma sebagai bidangnya sendiri, jadi hasilnya akan benar-benar field1<space><tab><space>field2
, (karena akan menggunakan pemisah spasi putih secara default) sebagai lawan field1<tab>field2
yang mungkin adalah apa Anda mengharapkan. menggunakan Output Field Separator (OFS) hampir selalu sesuai dengan keinginan Anda.
awk '{print $NF-1, $NF}' inputfile
Catatan: ini hanya berfungsi jika setidaknya ada dua kolom. Pada catatan dengan satu kolom Anda akan mendapatkan palsu"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
ada ($NF) - 1
di setiap awk
implementasi.
yacc
tata bahasa, yang ironis mengingat apa singkatan dari A di awk. Versi berbeda dari awk mem-parsing hal secara berbeda? Kejutan besar!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- atau masukan lainnya di mana kolom ke-2 terakhir tidak kurang dari kolom terakhir.
@jim mcnamara: coba gunakan tanda kurung untuk sekitar NF
, yaitu $(NF-1)
dan $(NF)
sebagai ganti $NF-1
dan $NF
(bekerja di Mac OS X 10.6.8 untuk FreeBSD awk
dan gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- yang setidaknya lebih portabel daripada $NF-1
; itu pasti kurang ambigu. $(NF)
adalah berlebihan, meskipun - $NF
akan berhasil. Menjaga terhadap baris dengan kurang dari 2 kolom juga bermanfaat, karena dengan baris satu kolom Anda akan mendapatkan nilai kolom pertama dua kali , dan dengan nol-kolom - yaitu, baris kosong - perintah awk akan gagal sama sekali, karena suatu percobaan untuk mengakses bidang dengan indeks -1.
menggunakan gawk menunjukkan masalahnya:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Saya baru saja melongo pada Solaris 10 M4000: Jadi, gawk adalah cuplrit pada masalah $ NF-1 vs. $ (NF-1). Pertanyaan selanjutnya apa yang dikatakan POSIX? per:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Tidak ada arah dengan satu atau lain cara. Tidak baik. gawk menyiratkan pengurangan, awks lainnya menyiratkan jumlah bidang atau pengurangan. hmm.
$(NF-1)
adalah bahwa dua contoh penghitungan indeks bidang dalam spesifikasi menggunakan formulir itu: $(NF-1)
dan $(NF+2)
. Lalu ada bagian "Ekspresi dalam awk", yang mencantumkan $expr
sebagai memiliki prioritas [jauh] lebih tinggi daripada expr - expr
. Karena NF
ekspresi itu sendiri, $NF-1
harus mengevaluasi ($NF)-1
. Bahkan JIKA, bagaimanapun, memang ada implementasi yang aneh di luar sana yang mengevaluasi $NF-1
sebagai $(NF-1)
, pelajaran yang didapat di sini adalah bahwa menggunakan $(NF-1)
adalah pilihan yang aman dan portabel.
coba dengan ini
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Harap coba ini untuk memperhitungkan semua kemungkinan skenario:
awk '{print $(NF-1)"\t"$NF}' file
atau
awk 'BEGIN{OFS="\t"}' file
atau
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file