![获取与数字出现次数编译的重复次数](https://linux22.com/image/177551/%E8%8E%B7%E5%8F%96%E4%B8%8E%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0%E7%BC%96%E8%AF%91%E7%9A%84%E9%87%8D%E5%A4%8D%E6%AC%A1%E6%95%B0.png)
我有一个大文件,其中包含这样的数字数据
123
124
124
124
126
127
127
我想获得重复的总数(从多次出现的每个数字中计算)。输出应为 5 as(124 重复 3 次,127 重复两次)。我可以使用它来计算重复次数cat file | sort | uniq -d | wc -l
,但它给出的输出为 2,即两个数字重复(124 和 127),我想要输出 5。
答案1
awk 'seen[$0]++ {count += (seen[$0]==2 ? 2:1)} END {print count+0}' file
如果以前见过某行,count
则增加 2 或 1(基于该行是否是第一个重复行)。最后打印count
(+0
以便 awk 打印 0 而不是空字符串,以防 casecount
从未增加)。
另一种方法:
awk '{count += seen[$0]; seen[$0] = (seen[$0]?1:2)} END {print count}' file
不要增加看到的数组值,而是使用数组提供 count 应增加的量 - 第一次看到一行时不增加,第二次出现时增加 2,然后每次重复出现时增加 1。
答案2
既然你标记了你的问题操作系统你可能有 GNU 实现uniq
,它有一个-D
选项:
-D print all duplicate lines
所以
$ sort file | uniq -D | wc -l
5
答案3
您可以使用awk
以下方法来计算数字:
sort file | uniq -dc | awk '{n+=$1}END{print n}'
输出:
5
(这里不需要cat
,因为sort
接受输入)
如果您uniq
不支持-dc
,那么
sort file | uniq -c | awk '$1>1{n+=$1}END{print n}'
答案4
尝试过以下方法
awk '{a[$1]++}END{for(x in a){print x,a[x]}}' ppp| awk '$2 >1{sum=sum+$2}END{print sum}'
输出
awk '{a[$1]++}END{for(x in a){print x,a[x]}}' ppp| awk '$2 >1{sum=sum+$2}END{print sum}'
5
添加Python方法
#!/usr/bin/python
m=open('ppp','r')
j=[]
f=[]
for i in m:
if i.strip() not in j:
j.append(i.strip())
e=open('ppp','r')
for i in e:
f.append(i.strip())
r=0
for w in j:
if f.count(w) >1:
r=r+f.count(w)
print r
output
5