숫자의 발생 횟수로 컴파일된 반복 횟수를 가져옵니다.

숫자의 발생 횟수로 컴파일된 반복 횟수를 가져옵니다.

다음과 같은 숫자 데이터가 포함된 대용량 파일이 있습니다.

123
124
124
124
126
127
127

총 중복 수(여러 번 나타나는 각 숫자로 계산)를 얻고 싶습니다. 출력은 5as(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을 인쇄하도록 count).

또 다른 방법:

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

표시된 대로 배열 값을 증가시키는 대신 배열을 사용하여 증가해야 하는 개수를 제공합니다. 행이 처음 표시될 때 증가하지 않고 두 번째 발생 시 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

관련 정보