If statement awk:在一个文件中多次满足条件时,只打印一次文件名

If statement awk:在一个文件中多次满足条件时,只打印一次文件名,if-statement,awk,criteria,If Statement,Awk,Criteria,我有一系列的文件,想知道哪些文件符合特定的标准(例如$1==“ice”&&&$2==“cream”)。在同一文件中多次满足此标准。我希望awk在满足此条件时打印一次文件名 我希望我能说清楚。试试这个(下一个文件是GNU扩展): 或者如果您没有GNU: awk 'FNR==1{p=0} $1=="ice" && $2=="cream" && !p {print FILENAME;p=1}' file1 file2 file3 FNR==1重置每个文件开头的p标志

我有一系列的文件,想知道哪些文件符合特定的标准(例如$1==“ice”&&&$2==“cream”)。在同一文件中多次满足此标准。我希望awk在满足此条件时打印一次文件名

我希望我能说清楚。

试试这个(下一个文件是GNU扩展):

或者如果您没有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}'

这个
awk
应该可以

awk '$1 == "ice" && $2 == "cream" {print FILENAME}' *
要获取行号和行号信息,您可以使用:

awk '$1 == "ice" && $2 == "cream"  {print NR,$0,"->",FILENAME}' *
另一个版本:

awk '/^ice cream/ {print NR,$0,"->",FILENAME}' *

退出
此处将只打印找到的第一个文件名。如果他喜欢所有带有
ice
cream
的文件,则会失败。在grep中使用正则表达式,如果行在
ice
之前有
cream
将失败,第二个版本的
END
部分仅在命中数在多个文件中时打印最后一个文件。@Jotne我假设他在冰淇淋之前有冰淇淋,因为他检查了$1中的冰淇淋和$2中的冰淇淋。你是对的,但是grep也会为这句话提供点击率
我的冰激凌
的确!这就是为什么我说它“非常相似”。
awk '/^ice cream/ {print NR,$0,"->",FILENAME}' *