使用 grep 并使用 awk 命令查找唯一出现的情况

使用 grep 并使用 awk 命令查找唯一出现的情况

如何使用 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 | $4awk
  • 当您完成解析文件(END块)并且对于rec关联数组的每个组件时a,连接打印文件名“FILENAME”、rec$2 | $3 | $4以及该值出现的次数a[rec]
  • awk使一些方便的内部变量'例如当前处理的文件名'FILENAME'可供您使用。
  • for循环的连续输出的单一重定向output.txt是完全可选的。如果你抑制它,你只会输出到stdout.

=====================================

这个答案是编辑并根据@AdminBee、@roaima、@dave_thompson 和@kusalananda 的许多有用评论进行了改进。

相关内容