Saya belajar awk dari The AWK Programming Language dan saya punya masalah dengan salah satu contohnya.
Jika saya ingin mencetak $ 3 jika $ 2 sama dengan nilai (misalnya 1
), saya menggunakan perintah ini yang berfungsi dengan baik:
awk '$2==1 {print $3}' <infile> | more
Tetapi ketika saya mengganti 1 dengan kriteria pencarian lain, (misalnya findtext
), perintahnya tidak berfungsi:
awk '$1== findtext {print $3}' <infile> | more
Itu tidak mengembalikan output dan saya yakin bahwa 'findtext' ada di file input.
Saya juga mencoba ini, tetapi tidak berhasil:
awk '$1== "findtext" {print $3}' <infile> | more
Ini file pengujian saya bernama 'test' dan memiliki 9 baris dan 8 bidang, dipisahkan oleh spasi:
1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ
Inilah yang saya lakukan dan hasilnya:
$awk '$8 == "ClNonZ" {print $3}' test
$ grep ClNonZ test
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ
Saya berharap untuk melihat ini yang merupakan $ 3 yang memiliki "ClNonZ" di $ 8 mereka.
0.180467091
0.010615711
0.492569002
Tidak tahu mengapa perintah awk tidak mengembalikan apapun. Ada pemikiran?
Jawaban:
Jika Anda mencari string tertentu, berikan tanda kutip di sekitarnya:
Jika tidak, awk akan menganggap itu nama variabel.
sumber
awk '{ print $8 }'
memberi Anda apa yang Anda harapkan?AWK
implementasi (periksa denganawk --version
), lihat jawaban saya, itu berfungsiGAWK
danMAWK
juga.awk "$1 == \"findtext\" {print $3}"
Metode ini menggunakan regexp, seharusnya berfungsi:
sumber
Tergantung pada
AWK
implementasinya, apakah yang Anda gunakan==
ok atau tidak.Sudahkah Anda mencoba
~
? Misalnya, jika Anda ingin $ 1 menjadi "halo":^
berarti $ 1 awal, dan$
$ 1 akhir.sumber
awk
gagal untuk dicocokkan==
, tetapi berhasil dengan~
.$1 == "hello"
dan$1 ~ /^hello$/
. Anda tidak boleh melakukan$1 ~ "^hello$"
seperti yang ditunjukkan dalam jawaban ini karena menggunakan string dalam konteks regexp dan awk harus mengonversi string menjadi regexp sebelum menggunakannya dan itu memiliki efek samping (man awk).Ini lebih mudah dibaca untuk saya
sumber
Versi awk saya adalah 3.1.5.
Ya, file masukan dipisahkan spasi, tidak ada tab.
Menurut jawaban arutaku, inilah yang saya coba yang berhasil:
Apa yang tidak berhasil (saya tidak tahu mengapa dan mungkin karena versi awk saya :),
Terima kasih atas jawaban, komentar, dan bantuan Anda!
sumber
ClNonZ<control-M>
, bukanClNonZ
itu sebabnya perbandingan pencocokan parsial RE seperti yang dilakukan dengan grep atau "~ "di awk menemukannya tetapi perbandingan kesetaraan tidak.silahkan coba ini
atau
sumber