awk를 사용하여 열의 하위 문자열을 기반으로 행 추출

awk를 사용하여 열의 하위 문자열을 기반으로 행 추출

다음 형식의 탭으로 구분된 vcf 파일이 있습니다.

#CHROM  POS   REF   ALT       INFO
chr1    111    A    TT;C     AC=0;AN=33
chr1    111    A     G;t     AC=0;AN=100
chr1    111    G     A       AC=110;AN=51
chr2    737    T     Q       AC=99;AN=10003
chr2    888    G     G       AC=100;AN=1636

AC가 있는 새 텍스트 파일로 줄을 추출하고 싶습니다.정보열이 100보다 크므로 예상되는 출력은 다음과 같습니다.

#CHROM  POS   REF   ALT  INFO
chr1    111    G     A   AC=110;AN=51

지금까지 가지고 있는 awk 명령은 다음과 같습니다.


awk 'NR==1 || /AC=[0-9][0-9][0-9]+/ && !/AC=100/'  file.vcf > output.txt

하지만 파일이 커서 완료하는 데 시간이 오래 걸립니다. 추출할 수 있는 방법이 있나요? $5의 AC(즉, 정보 열)가 100보다 커야 한다고 지정합니다. 통찰력을 높이 평가하겠습니다.

답변1

$ awk -F'[\t=]' 'NR==1 || ($6+0)>100' file
#CHROM  POS     REF     ALT     INFO
chr1    111     G       A       AC=110;AN=51

또는 원하는 경우:

$ awk '{split($NF,p,/[=;]/)} NR==1 || p[2]>100' file
#CHROM  POS     REF     ALT     INFO
chr1    111     G       A       AC=110;AN=51

답변2

이를 위해 awk를 사용하지 마십시오. 내 말은, 할 수 있지만 더 나은 도구가 있다는 것입니다. 이것이 실제로 유효한 VCF 파일이라면 다음과 같을 것입니다:

##fileformat=VCFv4.3
##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##contig=<ID=chr1>
##contig=<ID=chr2>
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  foo
chr1    111 .   A   TT,C    100 PASS    AC=0;AN=33  GT  0/1
chr1    111 .   A   G,t 100 PASS    AC=0;AN=100 GT  0/1
chr1    111 .   G   A   100 PASS    AC=110;AN=51    GT  0/1
chr2    737 .   T   Q   100 PASS    AC=99;AN=10003  GT  0/1
chr2    888 .   G   G   100 PASS    AC=100;AN=1636  GT  1/1

그런 다음 사용할 수 있습니다bcftools:

$ bcftools view -i "AC[*]>100" foo.vcf
##fileformat=VCFv4.3
##FILTER=<ID=PASS,Description="All filters passed">
##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##contig=<ID=chr1>
##contig=<ID=chr2>
##bcftools_viewVersion=1.16+htslib-1.16
##bcftools_viewCommand=view -i AC[*]>100 foo.vcf; Date=Sat Nov  5 12:40:53 2022
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  foo
chr1    111 .   G   A   100 PASS    AC=110;AN=51    GT  0/1

실제 VCF가 아니고 질문에 표시된 대로 다음을 수행할 수 있습니다.

$ perl -ne '/AC=(\d+)/; print if /^#/ || $1 > 100' foo.notVcf
#CHROM  POS   REF   ALT       INFO
chr1    111    G     A       AC=110;AN=51

답변3

사용awk

$ awk '{split($NF,array,";");split(array[1],var,"=")}  NR==1 || var[2]>100'
#CHROM  POS   REF   ALT       INFO
chr1    111    G     A       AC=110;AN=51

관련 정보