방금 특정 열에서 특정 값이 있는 행을 필터링하는 방법에 대해 질문했습니다.
이제 특정 열에서 특정 값을 가진 행을 삭제하고 싶습니다. 어떻게 해야 하나요?
예를 들어 1/1
표시된 열의 12345
행을 삭제 file.vcf.gz
하고 나머지 행을newfile.vcf.gz
예를 들어
#CHROM POS ALT 12345
1 345632 T 0/1:4,4:8:99:105,0,106
4 032184 C 1/1:46,9:55:99:99,0,1222
6 843290 A 0/1:67,20:87:99:336,0,1641
예상되는 결과:
1 345632 T 0/1:4,4:8:99:105,0,106
6 843290 A 0/1:67,20:87:99:336,0,1641
답변1
이 하나.
zcat file.vcf.gz | awk '$4 !~ /^1\/1/' | gzip -c > new.vcf.gz
!
$4가 패턴이 아니면 일치합니다. 그러나 헤더 행은 제거되지 않습니다. 헤더 행을 제거하려면 파이프라인에 추가하면 됩니다 head -n +2
.
zcat file.vcf.gz | head -n +2 |awk '$4 !~ /^1\/1/' | gzip -c > new.vcf.gz
답변2
행을 삭제하려면 다음을 선호합니다 sed
.
zcat file.gz | sed ':1/1:d' | gzip -c > new_file.gz
또는 grep
일치하는 줄을 무시하고 inverse 를 실행합니다.
zgrep -v '1/1' file.gz | gzip -c > new_file.gz
헤더를 동시에 제거하려면 중간 sed
또는 스트리핑을 하나 더 만드 tail
십시오.
zcat file.gz | sed -e ':1/1:d' -e '1d' | gzip -c > new_file.gz
zgrep -v '1/1' file.gz | tail -n +2 | gzip -c > new_file.gz