获取使用数字出现次数编译的重复次数

use*_*623 2 linux grep awk

我有一个包含这样的数字数据的大文件

123
124
124
124
126
127
127
Run Code Online (Sandbox Code Playgroud)

我想获得总重复次数(从每个出现多次的数字中计算)。输出应为 5 as(124 重复 3 次,127 重复 2 次)。我能够计算重复次数,cat file | sort | uniq -d | wc -l但它给出的输出为 2,即重复两个数字(124 和 127),我想要输出 5。

gue*_*est 8

awk 'seen[$0]++ {count += (seen[$0]==2 ? 2:1)} END {print count+0}' file
Run Code Online (Sandbox Code Playgroud)

如果之前看到过一行,则增加count2 或 1(基于此行是否是第一个重复项)。最后打印count+0以便 awk 打印 0 而不是空字符串,以防万一count从未增加)。

另一种方法:

awk '{count += seen[$0]; seen[$0] = (seen[$0]?1:2)} END {print count}' file
Run Code Online (Sandbox Code Playgroud)

不是增加看到的数组值,而是使用数组提供计数应该增加的数量——第一次看到一行时没有,第二次出现时为 2,随后的每个重复为 1。


ste*_*ver 6

由于您将问题标记为linux,您可能拥有 GNU 实现uniq,它有一个-D选项:

   -D     print all duplicate lines
Run Code Online (Sandbox Code Playgroud)

所以

$ sort file | uniq -D | wc -l
5
Run Code Online (Sandbox Code Playgroud)


pLu*_*umo 5

您可以使用awk来计算数字:

sort file | uniq -dc | awk '{n+=$1}END{print n}'
Run Code Online (Sandbox Code Playgroud)

输出:

5
Run Code Online (Sandbox Code Playgroud)

cat这里不需要,因为sort接受输入)

如果你uniq不支持-dc,那么

sort file | uniq -c | awk '$1>1{n+=$1}END{print n}'
Run Code Online (Sandbox Code Playgroud)