查找文件中数字的重复总次数

查找文件中数字的重复总次数

我有一个包含字符串 Global=x 的文件,其中 x 是文本行之间的数字。我想计算从字符串“Global=x”中提取的数字“x”的重复总数。我不想打印每个“x”的出现次数。

例如,如果输入文件类似于

Global=33333
Global=33333
Global=33334
Global=33335
Global=33336
Global=33337
Global=33337
Global=33337

输出应该是 2,因为两个数字“33333”和“33337”被重复(重复多少次并不重要)。

我试过

grep -Po '(Global)=\K\d+' file.dat | sort | uniq -c

但我得到了每个数字出现的频率,这是我不需要的:

2 33333
1 33334
1 33335
1 33336
3 33337

任何帮助将不胜感激,gre、awk 和 sed 解决方案都是可以接受的。

答案1

您可以更改uniq -cuniq -d

$ grep -Po '(Global)=\K\d+' file.dat | sort | uniq -d
33333
33337

-d仅打印重复的行。另一个管道可以wc -l对这些行进行计数。另请注意,grep 的两个-P&-o选项都是非标准的,因此并非在每个版本的grep.

答案2

要获取重复的数字列表并消除所有额外的过程:

$ awk -F= '$1=="Global"{c[$2]++} END{for (num in c) if(c[num]>1)print num}' file.dat
33333
33337

上面的代码用作=字段分隔符。如果第一个字段是Global,那么我们将在关联数组中跟踪第二个字段出现在文件中的c次数。$2

完全读取文件后,我们查看数组c并打印所有计数大于 1 的数字。

较短的版本

根据提议格伦·杰克曼在评论中,我们可以简单地在第二次出现时打印该数字:

$ awk -F= '++c[$2] == 2 {print $2}' file.dat
33333
33337

答案3

在每个 UNIX 机器上的任何 shell 中使用任何 awk:

$ awk -F'=' '++cnt[$2] == 2{ dups++ } END{print dups+0}' file
2

如果您确实需要检查的Global话:

$ awk -F'=' '($1 == "Global") && (++cnt[$2] == 2){ dups++ } END{print dups+0}' file
2

+0END 中的 是为了确保即使输入中没有重复,您也能获得数字输出(而0不是空字符串)。

相关内容