파일에서 숫자의 총 반복 횟수 찾기

파일에서 숫자의 총 반복 횟수 찾기

Global=x 문자열이 포함된 파일이 있습니다. 여기서 x는 텍스트 줄 사이의 숫자입니다. 문자열 "Global=x"에서 추출된 숫자 "x"의 총 반복 횟수를 계산하고 싶습니다. 각 "x"의 발생 횟수를 인쇄하고 싶지 않습니다.

예를 들어 입력 파일이 다음과 같은 경우

Global=33333
Global=33333
Global=33334
Global=33335
Global=33336
Global=33337
Global=33337
Global=33337

"33333"과 "33337"이라는 두 숫자가 반복되므로(몇 번이든 상관없음) 출력은 2가 되어야 합니다.

나는 노력했다

grep -Po '(Global)=\K\d+' file.dat | sort | uniq -c

그러나 나는 필요하지 않은 각 숫자의 발생 빈도를 얻습니다.

2 33333
1 33334
1 33335
1 33336
3 33337

어떤 도움이라도 대단히 감사하겠습니다. gre, awk 및 sed 솔루션이 허용됩니다.

답변1

uniq -c다음 과 같이 변경할 수 있습니다 uniq -d.

$ grep -Po '(Global)=\K\d+' file.dat | sort | uniq -d
33333
33337

-d중복된 줄만 인쇄됩니다. 다른 파이프라인에서는 wc -l이러한 행을 계산할 수 있습니다. 또한 grep에 대한 -P& 옵션은 모두 -o비표준이므로 모든 버전의 grep.

답변2

중복된 번호 목록을 얻고 모든 추가 절차를 제거하려면:

$ awk -F= '$1=="Global"{c[$2]++} END{for (num in c) if(c[num]>1)print num}' file.dat
33333
33337

=위의 코드는 필드 구분자 로 사용됩니다 . 첫 번째 필드가 이면 Global두 번째 필드가 연관 배열의 파일에 나타나는 횟수를 추적합니다 c.$2

파일을 완전히 읽은 후 배열을 살펴보고 c1보다 큰 개수가 있는 모든 숫자를 인쇄합니다.

더 짧은 버전

제안에 따르면글렌 잭맨주석에서 두 번째 나타나는 숫자를 간단히 인쇄할 수 있습니다.

$ awk -F= '++c[$2] == 2 {print $2}' file.dat
33333
33337

답변3

모든 UNIX 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk -F'=' '++cnt[$2] == 2{ dups++ } END{print dups+0}' file
2

꼭 확인해야 할 경우 Global:

$ awk -F'=' '($1 == "Global") && (++cnt[$2] == 2){ dups++ } END{print dups+0}' file
2

+00END에서는 입력에 중복 항목이 없더라도 (빈 문자열이 아닌) 숫자 출력을 얻도록 하는 것입니다 .

관련 정보