첫 번째 중복 인스턴스 유지

첫 번째 중복 인스턴스 유지

여러 열이 포함된 파일이 있고 bash 스크립트를 사용하여 특정 열 값(열 3-6)을 복사하는 행을 식별했습니다.

입력 예:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

두 개의 중복 값 인스턴스를 표시할 수 있습니다. 다른 열 값(1, 2, 7+열)은 두 행 간에 다를 수 있으므로 두 인스턴스를 모두 확인해야 합니다.

고유한 레코드를 저장하고 싶고 이러한 중복 항목을 정렬한 후 중복 레코드의 첫 번째 인스턴스가 열 5(모든 순서 가능)로 정렬된 다음 열 1(내림차순 --> 가장 큰 첫 번째 값)으로 정렬되었습니다.

원하는 출력:

A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

참고: 최종 출력의 순서는 나중에 정렬되므로 중요하지 않습니다. 필요한 행이 존재하는지 확인하는 것이 중요합니다.

지금까지 내 코드는 다음과 같습니다

tot=$(awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename | wc -l)  #counts duplicated records and saves overall count as $tot
if [ $tot == "0" ] 
then
    awk '{print}' oldfilename >> newfilename  #if no dups found, all lines saved in new file
else if
    awk '(!(n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;})' oldfilename >> newfilename  #if dups found, unique lines in old file saved in new file
else
    awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename > tempfile  #save dups in tempfile
    sort -k1,1, -k5,5 tempfile  #sort tempfile on cols 1 then 5 (want descending order)                  
fi

내가 할 수 없는 일은 각 복제본의 첫 번째 인스턴스를 가져와 새 파일에 저장하는 것입니다. 하지만 위 코드에는 여전히 오류가 있습니다.

도와주세요.

답변1

sort그 자체로는 충분합니다. 먼저 행이 필드 범위별로 "그룹화"되도록 정렬되고 3-6, 각 그룹 내의 레코드는 필드 합계를 기준으로 추가로 5정렬 됩니다 1. sort -u최후 3-6의 수단 비교를 비활성화하고 3-6각 그룹의 첫 번째 레코드를 반환하는 파이프입니다 . 마지막으로 sort이번에는 필드 51

sort -k3,6 -k5,5r -k1,1r file | sort -k3,6 -u | sort -k5,5r -k1,1r
A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

답변2

내가 올바르게 이해했다면 이것으로 충분할 것입니다.

$ sort input | uniq -f 2
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
A B C D E F G

-f 2스위치는 uniq처음 2개 필드 비교를 건너뛰도록 지시합니다. 따라서 마지막 3개 필드의 중복 항목 중 첫 번째 인스턴스가 유지됩니다.

관련 정보