awk:在文件中多次满足条件时打印FILENAME一次

时间:2014-03-06 12:28:36

标签: if-statement awk criteria

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

我希望我能说清楚。

2 个答案:

答案 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}' *