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 ' ' '|'
: 공백을 다시 변환합니다|
.