첫 번째 열이 반복되는 경우 파일에서 전체 행 제거

첫 번째 열이 반복되는 경우 파일에서 전체 행 제거

두 개의 열과 천만 개의 행이 포함된 파일이 있습니다. 첫 번째 열에는 반복되는 값이 많이 포함되어 있는데, 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

몇 가지 방법:

  1. awk '!a[$1]++' file
    

    이것은 이것을 작성하는 매우 축약된 방법입니다.

    awk '{if(! a[$1]){print; a[$1]++}}' file
    

    따라서 현재 첫 번째 필드( $1)가 배열에 없으면 a행을 인쇄하고 첫 번째 필드를 에 추가합니다 a. 다음에 해당 필드를 볼 때 배열에 있으므로 인쇄되지 않습니다.

  2. 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
    
  3. 코어틸스

    rev file | uniq -f 1 | rev
    

    이 방법은 먼저 줄을 뒤집어서 한 file줄이 12 345이면 이제 543 21이 됩니다. 그런 다음 uniq -f 1첫 번째 필드, 즉 543이 있는 열을 무시하는 데 사용합니다. file. 여기를 사용하면 uniq중복된 줄을 필터링하여 각각 하나만 유지하는 효과가 있습니다. 마지막으로 다른 역순을 사용하여 선을 원래 순서로 되돌립니다.

  4. 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

첫 번째는 대용량 파일을 사용하면 확실히 더 빨라질 것입니다.

관련 정보