두 개의 열과 천만 개의 행이 포함된 파일이 있습니다. 첫 번째 열에는 반복되는 값이 많이 포함되어 있는데, 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
. Perl 은-n
입력 파일을 한 줄씩 읽고 에서 제공하는 스크립트를-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
중복된 줄을 필터링하여 각각 하나만 유지하는 효과가 있습니다. 마지막으로 다른 역순을 사용하여 선을 원래 순서로 되돌립니다.GNU 정렬(제안됨작성자: @StéphaneChazelas
sort -buk1,1
플래그
-b
는 선행 공백을 무시하고-u
고유한 필드만 인쇄한다는 의미입니다. 영리한 부분은-k1,1
. 플래그-k
는 정렬할 필드를 설정합니다. 정렬 시 POS2를 통해-k POS1[,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
첫 번째는 대용량 파일을 사용하면 확실히 더 빨라질 것입니다.