我有一系列文件,想知道哪些符合某個標準(例如$ 1 ==「ice」& & $ 2 ==「cream 「)。這個標準在同一個文件中會遇到好幾次。我希望awk在滿足這個標準時打印一次文件名。awk:在文件中多次滿足條件時打印FILENAME
我希望我明確自己。
我有一系列文件,想知道哪些符合某個標準(例如$ 1 ==「ice」& & $ 2 ==「cream 「)。這個標準在同一個文件中會遇到好幾次。我希望awk在滿足這個標準時打印一次文件名。awk:在文件中多次滿足條件時打印FILENAME
我希望我明確自己。
試試這個(下一文件是GNU擴展):
awk '$1=="ice" && $2=="cream"{print FILENAME;nextfile}' file1 file2 file3
或者,如果你沒有GNU:
awk 'FNR==1{p=0} $1=="ice" && $2=="cream" && !p {print FILENAME;p=1}' file1 file2 file3
的FNR==1
在每個文件的開始復位p
標誌,然後當滿足條件時,p
標誌被設置爲1
,因此文件名只出現一次。
順便說一句,你可能更喜歡這種簡單:
grep -l "^ice.*cream" file*
這是不完全相同,但很相似。
EDITED驗收
在這之後是可以更優雅的另一種可能性。它將匹配文件的名稱保存在數組names[]
中,並在最後打印數組names[]
的鍵。
awk '$1=="ice" && $2=="cream" {names[FILENAME]++} END{for(i in names)print i}'
這awk
應該做
awk '$1 == "ice" && $2 == "cream" {print FILENAME}' *
要得到行號和行信息,您可以使用:
awk '$1 == "ice" && $2 == "cream" {print NR,$0,"->",FILENAME}' *
另一個版本:
awk '/^ice cream/ {print NR,$0,"->",FILENAME}' *
'這裏exit'將這樣做,它只會打印第一個它與命中找到的文件名。如果他喜歡所有帶有「冰」和「奶油」的文件,它將會失敗。在grep中使用正則表達式,如果行在'ice'之前有'cream',將會失敗 – Jotne
謝謝,是的。 –
帶有'END'部分的第二個版本只打印最後一個文件,如果命中在多個文件中。 – Jotne