제가 전에 질문을 한 적이 있습니다.중복 필드를 식별하고 awk를 사용하여 인쇄합니다..
여러 열이 포함된 파일이 있고 특정 열 값(열 3-6)이 반복되는 행을 식별하고 싶습니다.
이에 대한 대답은awk 'n=x[$3,$4,$5,$6]{print n"\n"$0;} {x[$3,$4,$5,$6]=$0;}' file
지금 내가 겪고 있는 문제는 데이터 파일에서 위 코드로 식별된 모든 행을 제거하고 반복되지 않는 행만 남기고 싶다는 것입니다.
!=
대신 사용해 보았 =
으나 =와 동일한 결과를 얻거나 0행을 반환합니다. 나는 또한 시도했지만
awk '!seen[$3, $4, $5, $6]++' file
제거하려는 중복 항목의 첫 번째 인스턴스도 유지합니다.
답변1
해결책을 찾고 있지만 awk
의도한 결과가 중복을 제거하고 반드시 awk
개별적으로 전달하지 않는 것이라면 다음을 시도해 보십시오.
- 먼저 원본 입력 파일이 정렬되어 있는지 확인하십시오.
sort unsorted_file > file
- 뛰어다녔다이전에 찾은 awk 명령3~6열의 중복 항목을 식별하고 출력을 파일(예
file_3-6_dupes
: 명령 프롬프트)에 저장하는 데 사용됩니다.
$ awk 'n=x[$3,$4,$5,$6]{print n"\n"$0;} {x[$3,$4,$5,$6]=$0;}' file > file_3-6_dupes
- 마지막으로
comm
중복을 제거하려면 출력을 파일에 저장합니다file_3-6_uniques
. 예를 들면 다음과 같습니다.
$ comm -23 file file_3-6_dupes > file_3-6_uniques
어떻게 작동하나요?
- 정렬된 입력만 제대로 작동하므로 정렬된 입력이
file
필요합니다 .comm
- 이
awk
명령은 찾은 중복 항목이 나타나는 순서를 변경하지 않고 원본 파일에 있던 순서를 따르므로file
실제로는file
원본 파일을 먼저 정렬하면 됩니다. - 기본적으로
comm
세 개의 열(파일 1의 행만, 파일 2의 행만, 공통 행)이 출력됩니다. - 파일 1:
file
- 파일 2:
file_3-6_dupes
-number
옵션은comm
억제할 출력 열을 지정합니다.- 즉
-3
,comm
일반적인 출력 열 3을 억제한다는 의미입니다. file_3-6_dupes
여기에는 파생된 중복 항목만 포함되어 있으므로 이러한 중복 항목은 다음 과file
공통적으로 발견되는 유일한 것 입니다.file
file_3-6_dupes
- 우리는 반대를 원하기 때문에
-3
공통적인 것, 즉 중복된 것을 억제합니다. - 파일 2의 콘텐츠만 억제하기 위해 추가 콘텐츠가 필요하지 않습니다
-2
. 우리의 경우에는 아무것도 없습니다.
awk
따라서 원본 파일과 의 조합을 사용하여 comm
3-6열의 중복 행을 제거하는 목표를 달성할 수 있습니다.
팁
- 원본 버전이
file
Windows 버전인 경우 Unix가 아닌 줄 끝으로 인해comm
awk 빌드가 제대로 작동하지 않을 수 있습니다file_3-6_dupes
. 따라서 작동하지 않는 경우 계속 실행하고 단계를 다시 시도하면 작동합니다dos2unix
.file
comm