
두 개의 열과 천만 행이 있는 파일이 있습니다. 첫 번째 열에는 중복된 값이 많이 포함되어 있지만 열 2에는 다른 값이 있습니다. 중복된 행을 제거하고 를 사용하여 하나만 유지하고 싶습니다 awk
. 참고: 파일은 열 1의 값을 기준으로 정렬됩니다. 예를 들어:
1.123 -4.0
2.234 -3.5
2.234 -3.1
2.234 -2.0
4.432 0.0
5.123 +0.2
8.654 +0.5
8.654 +0.8
8.654 +0.9
.
.
.
.
예상 출력
1.123 -4.0
2.234 -3.5
4.432 0.0
5.123 +0.2
8.654 +0.5
.
.
.
.
답변1
여러 가지 방법:
앗
awk '!a[$1]++' file
이것은 매우 간결한 작성 방법입니다.
awk '{if(! a[$1]){print; a[$1]++}}' file
따라서 첫 번째 필드(
$1
)가 현재a
배열에 없으면 행을 인쇄하고 첫 번째 필드를 해당 배열에 추가합니다a
. 다음에 필드를 볼 때 해당 필드는 배열에 있으므로 인쇄되지 않습니다.펄
perl -ane '$k{$F[0]}++ or print' file
또는
perl -ane 'print if !$k{$F[0]}++' file
이것 은 기본 적으로 이전 것과 동일 합니다
awk
. 이로-n
인해 Perl은 입력 파일을 한 줄씩 읽고 제공된 스크립트를-e
각 줄에 적용합니다.-a
공백으로 각 행을 자동으로 분할하고 결과 필드를@F
배열 에 저장 합니다 . 마지막으로 첫 번째 필드를%k
해시에 추가하고 해당 필드가 아직 없으면 해당 행을 인쇄합니다. 같은 내용을 다음과 같이 쓸 수 있습니다.perl -e 'while(<>){ @F=split(/\s+/); print unless defined($k{$F[0]}); $k{$F[0]}++; }' file
핵심 도구
rev file | uniq -f 1 | rev
이 방법은 먼저 행을 뒤집어
file
행이 12 345라면 이제 543 21이 되도록 작동합니다. 그런 다음uniq -f 1
543이 있는 열인 첫 번째 필드를 무시합니다. 그 안에 필드가 있습니다file
. 여기서 사용된 효과uniq
는 중복 행을 필터링하여 행당 1개만 남기는 것입니다. 마지막으로, 또 다른 역 작업을 통해 라인을 원래 순서로 복원합니다.GNU 정렬(예:제안작성자: @StéphaneChazelas)
sort -buk1,1
이
-b
플래그는 선행 공백을 무시하고-u
메서드는 고유한 필드만 인쇄합니다. 현명한 점은-k1,1
이-k
플래그가 정렬할 필드를 설정한다는 것입니다. 이는 일반적인 형식입니다. 즉, 정렬할 때-k POS1[,POS2]
POS2를 통해 필드만 확인합니다 .POS1
즉,-k1,1
첫 번째 필드만 살펴보세요. 데이터에 따라 다음 옵션 중 하나를 추가할 수도 있습니다.-g, --general-numeric-sort compare according to general numerical value -n, --numeric-sort compare according to string numerical value
답변2
첫 번째 열의 길이가 항상 5자인 경우 간단히 다음을 사용할 수 있습니다 uniq
.
uniq -w 5 file
그렇지 않은 경우 다음을 사용하십시오 awk
.
awk '$1!=a{print $0; a=$1}' file
대용량 파일의 경우 첫 번째 파일이 확실히 더 빠릅니다.