我有一系列文件,想知道哪些符合某个标准(例如$ 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