다른 열의 값을 기준으로 중복 항목 필터링

다른 열의 값을 기준으로 중복 항목 필터링

다음 데이터 프레임 예제가 있습니다. 세 번째 열의 요소가 반복될 수 있음을 알 수 있습니다. 5열에 가장 높은 값을 가진 항목을 유지하고 싶습니다.

~에 대한 의미AGCCCGGGG두 번째 항목인 다섯 번째 열의 값이 49인 것을 유지하고 싶습니다.

A00643:620:HFM7YDSX5:1:1124:7120:12352  ATCAGCCCGGGGCTTGGGCTAGGAC   GGGTGTGTG   548476  0   Corynebacterium
A00643:620:HFM7YDSX5:1:1150:15953:12524 CCTATCGTCGCTGGAATTCCCCGGG   AGCCCGGGG   1458266 1   Bordetella
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG   AGCCCGGGG   1458266 49  Bordetella
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG   TCTTGTGGT   585529  0   Corynebacterium
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC   GGGTGTGTG   548476  0   Corynebacterium
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA   TGCCCCGGG   1458266 0   Bordetella

답변1

awk유용한 도구는 다음과 같습니다.

awk -F'\t' 'l[$3] {if ($5>n[$3]) {n[$3]=$5; l[$3]=$0} ; next} 
            {n[$3]=$5 ; l[$3]=$0}
            END { for (i in l) {print l[i]}}' infile

-F'\t'- 탭 문자를 필드 구분 기호로 사용

두 번째 행부터 시작하겠습니다. n[$3]=$5열 5에 있는 숫자를 열 3으로 인덱싱된 배열에 저장하고 n, 전체 행을 l동일한 인덱스로 인덱싱된 배열에 저장합니다. 그러나 이는 다음과 같은 이유로 열 3에 고유한 값이 처음 나타날 때만 발생합니다.

l[$3] {...}l중괄호로 묶인 명령은 인덱스(=3열)의 요소가 $3배열에 있는 경우에만 실행됩니다. 이 경우 저장된 값은 n열 5와 비교되어 필요한 경우 업데이트됩니다. next방법다음 레코드로 이동, 즉 파일의 줄입니다.

END- 배열을 반복 l하고 $3고유하고 (첫 번째) 가장 높은 값을 가진 모든 행을 반환합니다 $5. 원본 파일의 순서는 `아니요유지하다.

답변2

모든 정렬 및 awk를 사용하십시오.

$ sort -rnk5,5 file | awk '!seen[$3]++'
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG       AGCCCGGGG       1458266 49      Bordetella
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA       TGCCCCGGG       1458266 0       Bordetella
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC       GGGTGTGTG       548476  0       Corynebacterium
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG       TCTTGTGGT       585529  0       Corynebacterium

아니면 awk만 사용하세요:

$ awk '
    !($3 in max) || ($5 > max[$3]) { max[$3]=$5; line[$3]=$0 }
    END { for (key in max) print line[key] }
' file
A00643:620:HFM7YDSX5:1:2476:4001:29496  ATTCACCCTATAGGAGCCCGGGGCA       TGCCCCGGG       1458266 0       Bordetella
A00643:620:HFM7YDSX5:1:1150:15628:12743 CCTATCGTCGCTGGAATTCCCCGGG       AGCCCGGGG       1458266 49      Bordetella
A00643:620:HFM7YDSX5:1:2124:8865:2472   ATCAGCCCGGGGCTTGGGCTAGGAC       GGGTGTGTG       548476  0       Corynebacterium
A00643:620:HFM7YDSX5:1:1450:4001:4507   GGCGATCGAAATGTCAAGCCCGGGG       TCTTGTGGT       585529  0       Corynebacterium

어떤 값도 기준으로 하지 않고 첫 번째 설정을 사용하여 초기화하므로 !($3 in max)최대값이 0 또는 음수인 경우에도 작동합니다. 최소/최대 계산에 대한 경험적 규칙은 항상 0이나 다른 임의의 값이 아닌 첫 번째 읽은 값으로 초기화하는 것입니다.max[$3]$3$5

모든 필드가 항상 존재한다고 말씀하셨고 처음 5개 필드에는 공백이 있어서는 안 된다고 말씀하셨기 때문에 FS를 탭으로 설정할 필요가 없습니다.

답변3

그냥 사용하십시오 sort:

sort -k3,3 -k5,5nr /tmp/my_acgt_file | sort -k3,3 -u

왼쪽은 파일을 세 번째 필드(가장 낮은 것부터)로 정렬한 다음, 동일할 경우 다섯 번째 필드(가장 높은 것부터)로 정렬합니다.

오른쪽은 (정렬된) 세 번째 필드만 고려하고 발견된 첫 번째 필드를 유지하고 나머지 필드를 삭제하여 고유함을 보장합니다.

관련 정보