다음 데이터 프레임 예제가 있습니다. 세 번째 열의 요소가 반복될 수 있음을 알 수 있습니다. 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
왼쪽은 파일을 세 번째 필드(가장 낮은 것부터)로 정렬한 다음, 동일할 경우 다섯 번째 필드(가장 높은 것부터)로 정렬합니다.
오른쪽은 (정렬된) 세 번째 필드만 고려하고 발견된 첫 번째 필드를 유지하고 나머지 필드를 삭제하여 고유함을 보장합니다.