次の数値データを含む大容量ファイルがあります。
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