awk 是否可以使用过滤器将输出行数添加到同一输出文件中?

awk 是否可以使用过滤器将输出行数添加到同一输出文件中?

我有内文件

11111
444
989
5512
121318

所以我想布局一个 awk 命令,该命令会产生如下所示的 outfile:outfile has ${thesemany} matches

在这种情况下outfile将如下所示:

outfile has 2 matches
11111
121318

我想我必须尝试一个END块,但这一行应该在开头。所以对BEGIN&END块和在哪里插入增量运算符感到困惑。

我的不完整awk-one-liner

awk 'BEGIN {print "outfile has ${thesemany} matches"} {(length($1) >= 5) print $1}' infile > outfile

答案1

鉴于在 之前您无法知道匹配的数量END,如果您想在那之后打印匹配本身,那么您将需要将它们保存到1,例如END

awk '
  length($1) >= 5 {matches = matches (matches ? ORS : "") $1; count++} 
  END {print "outfile has " count+0 " matches"; if(count) print matches}
' infile

如果您不关心输出顺序(或打算对匹配项进行排序),那么您可以将它们保存在数组中而不是连接字符串中。


1我想你可以在外部缓冲匹配,比如awk 'length($1) >= 5 {count++; print $1 | "cat"} END {print "outfile has " count+0 " matches"; close("cat")}' infile

答案2

您可以将所有匹配字段保存到临时数组并在 END 规则中转储数组:

awk 'length($1) >= 5 {a[$1]; count++; } END {print "outfile has", count, "matches"; for (elem in a) {print elem}}' infile

相关内容