정렬하지 않고 한 열 내에서 중복을 기준으로 행을 제거합니다.


30

큰 3 열 파일 (~ 10,000 줄)이 있고 해당 줄의 세 번째 열 내용이 다른 줄의 세 번째 열에 나타날 때 줄을 제거하고 싶습니다. 파일 크기는 약간 번거롭고 전체 행이 동일하지 않기 때문에 아래 코드와 같은 것을 사용할 수 없습니다. 3 열의 내용 만

awk '!seen[$0]++' filename

답변:


31

awk 명령을 중복 행을 제거하기 위해 수행하려는 열로 변경하십시오 (이 경우 세 번째 열).

awk '!seen[$3]++' filename

이 명령은 awk인쇄 할 행을 알려줍니다 . 변수 $3는 열 3의 전체 내용을 보유하며 대괄호는 배열 액세스입니다. 따라서 filename의 각 행의 세 번째 열에 대해 명명 된 배열의 노드 seen가 증분되고 해당 노드 (column3)의 내용이 !이전에 설정 되지 않은 경우 행이 인쇄됩니다 .

위의 awk명령은 입력 파일 의 열이 자신 과 구분 space되거나 그 Tab사이에 구분되는 경우 작동하며, 열이 다른 것으로 구분되면 -F옵션 으로 awk에 알려 주어야합니다 . 예를 들어, 모든 열이 쉼표 ( ,) 로 구분 되고 세 번째 열을 기준으로 행을 제거하려는 경우 -F','옵션을 사용하십시오 .

awk -F',' '!seen[$3]++' filename

18

sort명령은 이미 큰 파일을 처리하도록 최적화되어 있습니다. 따라서 sort파일에서 다음과 같이 명령을 잘 사용할 수 있습니다.

sort -u -t' ' -k3,3 file
  • -u -고유 한 줄만 인쇄하십시오.
  • -t-구분자를 지정하십시오. 이 예에서는 공백을 구분 기호로 사용합니다.
  • -k3,3 -3 번째 필드를 기준으로 정렬합니다.

답변을 참조하면 GNU 정렬이 실제로 큰 파일을 정렬하는 더 나은 방법이라는 것을 알 수 있습니다. 귀하의 경우에는 -parallel없이도 많은 시간 지연없이 최종 결과를 얻을 수 있다고 생각 합니다.


중복 키만이 아닌 중복 -u 만 제거 한다는 말만으로 어쨌든 언급하려고 했지만 ... 잘못되었습니다.
랜덤

@Ramesh는 작업을 수행하지만 정렬은 항상 예상하지 않는 라인 순서를 변경합니다.
Bharat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.