awk를 사용하여 중복 필드를 식별하고 제거하세요.

awk를 사용하여 중복 필드를 식별하고 제거하세요.

제가 전에 질문을 한 적이 있습니다.중복 필드를 식별하고 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개별적으로 전달하지 않는 것이라면 다음을 시도해 보십시오.

  1. 먼저 원본 입력 파일이 정렬되어 있는지 확인하십시오.sort unsorted_file > file
  2. 뛰어다녔다이전에 찾은 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
  1. 마지막으로 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공통적으로 발견되는 유일한 것 입니다.filefile_3-6_dupes
  • 우리는 반대를 원하기 때문에 -3공통적인 것, 즉 중복된 것을 억제합니다.
  • 파일 2의 콘텐츠만 억제하기 위해 추가 콘텐츠가 필요하지 않습니다 -2. 우리의 경우에는 아무것도 없습니다.

awk따라서 원본 파일과 의 조합을 사용하여 comm3-6열의 중복 행을 제거하는 목표를 달성할 수 있습니다.

  • 원본 버전이 fileWindows 버전인 경우 Unix가 아닌 줄 끝으로 인해 commawk 빌드가 제대로 작동하지 않을 수 있습니다 file_3-6_dupes. 따라서 작동하지 않는 경우 계속 실행하고 단계를 다시 시도하면 작동합니다 dos2unix.filecomm

관련 정보