我有一系列文件,想知道哪些符合某个标准(例如$ 1 ==“ice”&& $ 2 ==“cream”)。在同一文件中多次满足此标准。我希望awk在符合此标准时打印文件名一次。
我希望我能说清楚。
答案 0 :(得分:2)
试试这个(nextfile是一个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*
它不完全相同,但非常相似。
接受后加入
这是另一种可能更优雅的可能性。它将匹配文件的名称保存在数组names[]
中,并在末尾打印数组names[]
的键。
awk '$1=="ice" && $2=="cream" {names[FILENAME]++} END{for(i in names)print i}'
答案 1 :(得分:0)
此awk
应该
awk '$1 == "ice" && $2 == "cream" {print FILENAME}' *
要获取行号和行信息,您可以使用:
awk '$1 == "ice" && $2 == "cream" {print NR,$0,"->",FILENAME}' *
另一个版本:
awk '/^ice cream/ {print NR,$0,"->",FILENAME}' *