如何使用 grep 并使用 awk 查找唯一的出现次数,以便获得该值在文件中出现的次数,同时还获得文件的名称?
我已经尝试过这个:
zgrep '2020-04-20|12345|' FILENAME_* |awk -F '|' '{print $2 "|" $3 "|" $4}' | sort | uniq -c
它给出了文件第 2,3 和 4 列的唯一出现次数,但我想知道出现次数所在的文件的名称。我怎样才能做到这一点?
答案1
为了未压缩的和压缩的文件,尝试:
for f in FILENAME_*; do
zcat -f "$f" | awk '/2020-04-20\|12345\|/ {rec=$2 "|" $3 "|" $4; a[rec]+=1}
END {for (rec in a) print FILENAME " : " rec " : " a[rec]}'
done > output.txt
简要说明:
- 首先使用通配符 (
*
) 循环遍历所有可能的文件名。 - 用于
zcat -f <filename>
解压缩输入文件(请参阅1,2...)如果需要的话可以即时进行(-f
选项)。 zcat -f <filename> | awk ...
使用文件的解压缩输出$f
作为 的输入awk
。- 对于您找到的每个模式,每次遇到由 解析的记录中的值时,
2020-04-20|12345|
都会增加关联计数器数组。a
$2 | $3 | $4
awk
- 当您完成解析文件(
END
块)并且对于rec
关联数组的每个组件时a
,连接打印文件名“FILENAME”、rec
值$2 | $3 | $4
以及该值出现的次数a[rec]
。 awk
使一些方便的内部变量'例如当前处理的文件名'FILENAME'可供您使用。for
循环的连续输出的单一重定向output.txt
是完全可选的。如果你抑制它,你只会输出到stdout
.
=====================================
这个答案是编辑并根据@AdminBee、@roaima、@dave_thompson 和@kusalananda 的许多有用评论进行了改进。