Yang saya inginkan hanyalah dua kolom terakhir yang dicetak.
Yang saya inginkan hanyalah dua kolom terakhir yang dicetak.
Jawaban:
Anda dapat menggunakan variabel NFyang 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}' fileatau awk '{print $(NF-1), $NF}' fileatau 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>field2yang 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-1ada ($NF) - 1di setiap awkimplementasi.
yacctata 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-1dan $NF(bekerja di Mac OS X 10.6.8 untuk FreeBSD awkdan 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 - $NFakan 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 $exprsebagai memiliki prioritas [jauh] lebih tinggi daripada expr - expr. Karena NFekspresi itu sendiri, $NF-1harus mengevaluasi ($NF)-1. Bahkan JIKA, bagaimanapun, memang ada implementasi yang aneh di luar sana yang mengevaluasi $NF-1sebagai $(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