2013-05-29 57 views
0

我有> 100萬行看起來像這樣的一個文件只打印某些字符串:UNIX/bash下如何從一列

#CHROM POS ID REF ALT QUAL FILTER INFO 
1 63735 . CCTA C 106563.91 PASS AC=422;AF=0.301;AN=1401;BaseQRankSum=-18.154;DP=5730;FS=22.693;HOMLEN=3;HOMSEQ=CTA;HRun=0;HaplotypeScore=7.6359;InbreedingCoeff=-0.0873;MQ=26.67;MQ0=1215;MQRankSum=6.893;QD=18.67;ReadPosRankSum=7.611;SB=-51269.38;SVTYPE=DEL;VQSLOD=1.6440;culprit=InbreedingCoeff;set=UG-PINDEL 
1 83631 . GT G 29190.62 PASS AC=517;AF=0.398;AN=1298;BaseQRankSum=8.994;DP=2724;FS=14.345;HOMLEN=2;HaplotypeScore=2.8768;InbreedingCoeff=-0.0858;MQ=16.73;MQ0=6144;MQRankSum=22.879;QD=5.63;ReadPosRankSum=-4.971;SB=0.00;SVTYPE=DEL;HOMSEQ=TT;HRun=3;VQSLOD=1.2361;culprit=FS;set=UG-PINDEL 
1 125797 . CAAAAT C 2015.26 PASS AC=42;AF=0.039;AN=1084;BaseQRankSum=-0.600;DP=1083;FS=4.122;HOMLEN=3;HOMSEQ=AAA;HRun=0;HaplotypeScore=0.6543;InbreedingCoeff=-0.0391;MQ=11.09;MQ0=2508;MQRankSum=0.338;QD=3.86;ReadPosRankSum=-1.262;SB=-81.35;SVTYPE=INS;VQSLOD=3.1685;culprit=QD;set=UG-PINDEL 
1 572203 . AC A 2292.53 PASS AC=62;AF=0.041;AN=1520;BaseQRankSum=-0.597;DP=7721;FS=3.807;HOMLEN=3;HOMSEQ=CCC;HRun=4;HaplotypeScore=3.4199;InbreedingCoeff=-0.0516;MQ=21.98;MQ0=7155;MQRankSum=-10.737;QD=1.41;SB=-0.71;SVTYPE=DEL;ReadPosRankSum=0.803;VQSLOD=2.0910;culprit=FS;set=UG-PINDEL 

正如你所看到的,第八列(其中帶有「 INFO「作爲標題)由許多以分號分隔的信息組成。我想打印這個相同的文件,但是我想要第八列只打印「SVTYPE = DEL」或「SVTYPE = INS」,所以新文件看起來像這樣:

#CHROM POS ID REF ALT QUAL FILTER INFO 
1 63735 . CCTA C 106563.91 PASS SVTYPE=DEL 
1 83631 . GT G 29190.62 PASS SVTYPE=DEL 
1 125797 . CAAAAT C 2015.26 PASS SVTYPE=INS 
1 572203 . AC A 2292.53 PASS SVTYPE=DEL 

一個簡單的awk語句,其中我將第八列視爲由分號分隔的多個列不起作用,因爲「SVTYPE = DEL」或「SVTYPE = INS」並不總是出現在同一列中,然後...

任何想法?請讓我知道,如果你需要更多的信息!

回答

2

是這樣的? (頭略)

kent$ awk '$8=$8~/=DEL/?"SVTYPE=DEL":"SVTYPE=INS"' file 
1 63735 . CCTA C 106563.91 PASS SVTYPE=DEL 
1 83631 . GT G 29190.62 PASS SVTYPE=DEL 
1 125797 . CAAAAT C 2015.26 PASS SVTYPE=INS 
1 572203 . AC A 2292.53 PASS SVTYPE=DEL 
+0

這很好用,非常感謝! – Abdel

1

這應該做的伎倆:

awk ' 
BEGIN { 
    print "#CHROM POS ID REF ALT QUAL FILTER INFO" 
} 
NR>1 { 
    for (i=1; i<=NF;i++) if (i<8 || $i~/SVTYPE/) { 
     printf $i" " 
    }; 
    print "" 
}' FS="[ ;]" temp