12회 이상 중복 기록을 인쇄하는 방법은 무엇입니까?

12회 이상 중복 기록을 인쇄하는 방법은 무엇입니까?

awk를 사용하여 12번 이상 반복된 중복 레코드를 인쇄하는 방법

입력하다:

1|abc123
2|abc123
3|abc123
4|abc123
5|abc123
6|abc123
7|abc123 
8|abc123
9|abc123 
10|abc123
11|abc123
12|abc123
13|cde456
14|xyz321
15|jkl245
16|abc123
17|abc123
18|abc123
19|def567
20|abc123

예상 출력:

1|abc123
2|abc123
3|abc123
4|abc123
5|abc123
6|abc123
7|abc123 
8|abc123
9|abc123 
10|abc123
11|abc123
12|abc123
15|abc123
16|abc123
17|abc123
18|abc123
20|abc123

아래 명령을 시도했지만 정확한 출력을 얻지 못했습니다.

awk -F'|' 'NR==FNR{cnt[$2]++; next} cnt[$2]>12' input > output

답변1

예를 들어, 파일을 두 번 구문 분석하면 명령이 제대로 작동합니다.

awk -F'|' 'FNR==NR{c[$2]++;next} c[$2]>12' input input > output

첫 번째 패스에서는 발생 횟수를 계산하고 두 번째 패스에서는 c>12. 또한 메모리 효율성도 매우 높습니다. 원본 파일의 줄 순서도 존중됩니다. 원하는 경우 모든 정렬을 쉽게 수행할 수 있습니다.

그런데 현재 입력 예제에서는 12번 이상 나타나는 줄이 없습니다. 딱 적절한 시간에 abc123나타났습니다 . 12또한 이러한 이벤트 중 하나에는 후행 공백이 있는데 7|abc123이는 다른 두 번째 필드를 의미합니다.

답변2

실제로 "2 이상"이 아니라 "2 이상"을 의미한다고 가정하면 이것이 표시된 출력이므로 GNU 핵심 도구와 일부 sed를 사용하여 원하는 출력을 얻을 수 있습니다.

$ sed 's/  *$//' file | tr '|' ' ' | sort -t ' ' -k 2 | uniq -Df1 | tr ' ' '|'
3|6W0Q3WKP3DZ
6|6W0Q3WKP3DZ
10|81TE22WWDEDCVXBAQ6F20Z86GFW
7|81TE22WWDEDCVXBAQ6F20Z86GFW
9|81TE22WWDEDCVXBAQ6F20Z86GFW
2|BWDY6IGYBDTMAVQA
5|BWDY6IGYBDTMAVQA
1|PTPX9L1Y31QEL55H
4|PTPX9L1Y31QEL55H
  • sed 's/ *$//' file:대부분의 줄 끝에서 불필요한 공백을 제거한 다음
  • tr '|' ' '|: 공백으로 대체됩니다 .
  • sort -t ' ' -k 2: 공백으로 구분된 두 번째 필드를 기준으로 정렬한 다음
  • uniq -Df1: 중복을 확인할 때 중복 행( -D)만 유지하고 첫 번째 필드( )를 무시합니다 -f1.
  • tr ' ' '|': 공백을 다시 변환합니다 |.

관련 정보