数値の発生回数でコンパイルされた繰り返し回数を取得します。

数値の発生回数でコンパイルされた繰り返し回数を取得します。

次の数値データを含む大容量ファイルがあります。

123
124
124
124
126
127
127

合計重複数(複数回表示される各数字で計算)を取得したいと思います。出力は5as(124は3回繰り返され、127は2回繰り返されます)でなければなりません。繰り返し回数を計算するために使用できますが、cat file | sort | uniq -d | wc -l出力は2です。つまり、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を印刷するようにcount)。

別の方法:

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

示されているように配列値を増やす代わりに、配列を使用して増やす必要がある数を指定します。行が最初に表示されたときに増加せず、2回目の発生時に2だけ増加し、次に1だけ増加します。 1回繰り返されるたびに。

答え2

質問にタグ付けしたのでオペレーティングシステムuniqおそらく、次のオプションを持つGNU実装があります-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

関連情報