첫 번째 열이 중복되면 파일의 전체 행을 삭제합니다.

첫 번째 열이 중복되면 파일의 전체 행을 삭제합니다.

두 개의 열과 천만 행이 있는 파일이 있습니다. 첫 번째 열에는 중복된 값이 많이 포함되어 있지만 열 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. 이로 -n인해 Perl은 입력 파일을 한 줄씩 읽고 제공된 스크립트를 -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 1543이 있는 열인 첫 번째 필드를 무시합니다. 그 안에 필드가 있습니다 file. 여기서 사용된 효과 uniq는 중복 행을 필터링하여 행당 1개만 남기는 것입니다. 마지막으로, 또 다른 역 작업을 통해 라인을 원래 순서로 복원합니다.

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

대용량 파일의 경우 첫 번째 파일이 확실히 더 빠릅니다.

관련 정보