我有一个包含字符串 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 -c
为uniq -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
+0
END 中的 是为了确保即使输入中没有重复,您也能获得数字输出(而0
不是空字符串)。