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
파일을 완전히 읽은 후 배열을 살펴보고 c
1보다 큰 개수가 있는 모든 숫자를 인쇄합니다.
더 짧은 버전
제안에 따르면글렌 잭맨주석에서 두 번째 나타나는 숫자를 간단히 인쇄할 수 있습니다.
$ 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
+0
0
END에서는 입력에 중복 항목이 없더라도 (빈 문자열이 아닌) 숫자 출력을 얻도록 하는 것입니다 .