3열로 구성된 큰 파일(약 10,000행)이 있고 해당 행의 세 번째 열 내용이 다른 행의 세 번째 열에 나타날 때 행을 삭제하고 싶습니다. 파일 크기로 인해 정렬이 다소 번거롭고 전체 행이 열 3의 내용과 동일하지 않기 때문에 아래 코드와 같은 것을 사용할 수 없습니다.
awk '!seen[$0]++' filename
답변1
awk 명령을 중복 행을 제거하려는 열(귀하의 경우 세 번째 열)로 변경하면 됩니다.
awk '!seen[$3]++' filename
awk
이 명령은 인쇄할 줄을 알려줍니다 . 이 변수는 $3
열 3의 전체 내용을 보유하며 대괄호는 배열 액세스입니다. 따라서 filename의 세 번째 열마다 seen
해당 노드(열 3)의 내용이 !
이전에 설정되지 않은 경우( ) 지정된 배열의 노드가 증가되고 행이 인쇄됩니다. 이렇게 하면 첫 번째 행이 항상 유지됩니다(세 번째 열만 해당).
위의 내용은 입력 파일의 열이 공백/탭으로 구분된 경우 작동합니다. 그렇지 않은 경우 options 을 사용하여 awk에 알려야 합니다 -F
. 예를 들어 쉼표( ,
)로 구분된 열이 있고 세 번째 열을 기준으로 행을 삭제하려면 다음 명령을 사용합니다.
awk -F',' '!seen[$3]++' filename
답변2
sort
이 명령은 대용량 파일 처리에 최적화되었습니다. 따라서 sort
파일에서 명령을 잘 사용할 수 있습니다.
sort -u -t' ' -k3,3 file
-u
- 고유한 줄만 인쇄합니다.-t
- 구분 문자를 지정합니다. 이 예에서는 공백만 구분 기호로 사용합니다.-k3,3
- 세 번째 필드를 기준으로 정렬합니다.
당신은 참조 할 수 있습니다이것대답은 GNU 정렬이 실제로 대용량 파일을 정렬하는 더 좋은 방법임을 시사합니다. 귀하의 경우에는 그것이 없어도 -parallel
큰 시간 지체 없이 최종 결과를 얻을 수 있다고 생각합니다.