다음과 같은 숫자 데이터가 포함된 대용량 파일이 있습니다.
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