2017-01-04 8 views
0

Ich habe mit mehreren Spalten Datei und ich möchte einige Informationen in der Spalte extrahieren 71.Extrakt Infos von einem Tag mit awk

Ich möchte mit Hilfe von Tags extrahieren, die der Wert alles sein kann, zum Beispiel möchte ich nur extrahieren AC = *; AF = *, wobei der Wert alles sein kann.

fand ich ähnliche Frage und gab einen Versuch es aber nicht

wie diese

Extract columns with values matching a specific pattern

Säule 71 Aussehen funktionierten:

AC=14511;AC_AFR=382;AC_AMR=1177;AC_Adj=14343;AC_EAS=5;AC_FIN=427;AC_Het=11813;AC_Hom=1265;AC_NFE=11027;AC_OTH=97;AC_SAS=1228;AF=0.137;AN=106198;AN_AFR=8190;AN_AMR=10424;AN_Adj=99264;AN_EAS=7068;AN_FIN=6414;AN_NFE=51090;AN_OTH=658;AN_SAS=15420;BaseQRankSum=1.73;ClippingRankSum=-1.460e-01;DB;DP=1268322;FS=0.000;GQ_MEAN=190.24;GQ_STDDEV=319.67;Het_AFR=358;Het_AMR=1049;Het_EAS=5;Het_FIN=399;Het_NFE=8799;Het_OTH=83;Het_SAS=1120;Hom_AFR=12;Hom_AMR=64;Hom_EAS=0;Hom_FIN=14;Hom_NFE=1114;Hom_OTH=7;Hom_SAS=54;InbreedingCoeff=0.0478;MQ=60.00;MQ0=0;MQRankSum=0.037;NCC=270;POSITIVE_TRAIN_SITE;QD=21.41;ReadPosRankSum=0.212;VQSLOD=4.79;culprit=MQ;DP_HIST=30|3209|1539|1494|30007|7938|4130|2038|1310|612|334|185|97|60|31|25|9|11|7|33,0|66|339|1048|2096|2665|2626|1832|1210|584|323|179|89|54|31|22|7|9|4|15;GQ_HIST=84|66|56|82|3299|568|617|403|250|319|436|310|28566|2937|827|834|451|186|217|12591,15|15|13|16|25|11|22|28|18|38|52|31|65|76|39|83|93|65|97|12397;CSQ=T|ENSG00000186868|ENST00000334239|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11502.1|ENSP00000334886|TAU_HUMAN|B4DSE3_HUMAN|UPI0000000C16||||2/8||ENST00000334239.8:c.134-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000570299|Transcript|intron_variant&non_coding_transcript_variant||||||rs754512|1||1|MAPT|HGNC|6893|processed_transcript||||||||||2/6||ENST00000570299.1:n.262-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000340799|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS45716.1|ENSP00000340438|TAU_HUMAN||UPI000004EEE6||||3/10||ENST00000340799.5:c.221-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000262410|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11501.1|ENSP00000262410|TAU_HUMAN||UPI0000EE80B7||||4/13||ENST00000262410.5:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000446361|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11500.1|ENSP00000408975|TAU_HUMAN||UPI000004EEE5||||2/9||ENST00000446361.3:c.134-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000574436|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11499.1|ENSP00000460965|TAU_HUMAN||UPI000002D754||||3/10||ENST00000574436.1:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000571987|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11501.1|ENSP00000458742|TAU_HUMAN||UPI0000EE80B7||||3/12||ENST00000571987.1:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000415613|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS45715.1|ENSP00000410838|TAU_HUMAN||UPI0001AE66E9||||3/13||ENST00000415613.2:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000571311|Transcript|intron_variant&NMD_transcript_variant||||||rs754512|1||1|MAPT|HGNC|6893|nonsense_mediated_decay|||ENSP00000460048||I3L2Z2_HUMAN|UPI00025A2E6E||||4/4||ENST00000571311.1:c.*176-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000535772|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS56033.1|ENSP00000443028|TAU_HUMAN|B4DSE3_HUMAN|UPI000004EEE4||||4/10||ENST00000535772.1:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000576518|Transcript|stop_gained|5499|7|3|K/*|Aag/Tag|rs754512|1||1|MAPT|HGNC|6893|protein_coding|||ENSP00000458621||I3L170_HUMAN&B4DSE3_HUMAN|UPI0001639A7C|||1/7|||ENST00000576518.1:c.7A>T|ENSP00000458621.1:p.Lys3Ter|T:0.1171|||||||||15792962|||||POSITION:0.00682261208576998&ANN_ORF:-255.6993&MAX_ORF:-255.6993|PHYLOCSF_WEAK|ANC_ALLELE|LC,T|ENSG00000186868|ENST00000420682|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS45716.1|ENSP00000413056|TAU_HUMAN||UPI000004EEE6||||2/9||ENST00000420682.2:c.221-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000572440|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2790|||||rs754512|1||1|MAPT|HGNC|6893|retained_intron|||||||||1/1|||ENST00000572440.1:n.2790A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000351559|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS11499.1|ENSP00000303214|TAU_HUMAN||UPI000002D754||||4/11||ENST00000351559.5:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000344290|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding|YES|CCDS45715.1|ENSP00000340820|TAU_HUMAN||UPI0001AE66E9||||4/14||ENST00000344290.5:c.308-94A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000347967|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding|||ENSP00000302706|TAU_HUMAN|B4DSE3_HUMAN|UPI0000173D91||||4/10||ENST00000347967.5:c.32-100A>T||T:0.1171|||||||||15792962||||||||,T|ENSG00000186868|ENST00000431008|Transcript|intron_variant||||||rs754512|1||1|MAPT|HGNC|6893|protein_coding||CCDS56033.1|ENSP00000389250|TAU_HUMAN|B4DSE3_HUMAN|UPI000004EEE4||||3/9||ENST00000431008.3:c.308-94A>T||T:0.1171|||||||||15792962|||||||| 

Der Code, den ich versuchte:

awk '{ 
for (i = 1; i <= NF; i++) { 
    if ($i ~ /AC|AF/) { 
     printf "%s %s ", $i, $(i + 1) 
    } 
} 
print "" 

}‘

Ich bekomme immer Syntaxfehler.

Ausgang gesucht:

AC=14511;AF=0.137 
+1

Sie möchten die Werte nach 'AC/AF' oder müssen' AC = 14511' usw. – Inian

+0

Was Ihre 71st Spalte IST? Möchten Sie das 71. Byte ausschneiden, wird das 71ste Feld durch ';' oder das 75. Feld, das durch '|' – Rudi

+0

Warum bieten 1 massive Linie der Probeneingabe für diese anstatt etwas einfach für uns, um zu sehen/Test mit und dabei deine mehreren Spalten Anforderung wie AC = 1; AC_AFR = 2; AF = 3 AC = 4; AC_AFR = 5; AF = 6 und geben Sie an, dass Sie in Spalte 2 statt in Spalte 71 arbeiten möchten? Und wenn Sie "immer Syntaxfehler bekommen", warum sagen Sie uns nicht, was diese Fehlermeldung ist, damit wir Ihnen beim Debuggen helfen können? –

Antwort

0

So etwas sollte es tun (in Gnu awk aufgrund switch):

$ awk '{split($71,a,";");for(i in a)if(a[i]~/^AF/) print a[i]}' foo 
AF=0.137 

Sie split das Feld $71 von ; s, Schleife durch das Array Sie Split auf die Suche nach dem gewünschten Treffer. Für mehrere Übereinstimmungen verwenden switch:

$ awk '{ 
      split($0,a,";"); 
      for(i in a) 
       switch(a[i]) { 
        case /^AF=/: 
         b=b a[i] OFS; 
         break; 
        case /^AC=/: 
         b=b a[i] OFS; 
         break 
       } 
      sub(/.$/,"\n",b); 
      printf b 
     }' foo 
AC=14511 AF=0.137 

EDIT: Jetzt puffert es Ausgabe in eine Variable und druckt es am Ende. Sie können den Separator mit OFS steuern.

+1

Sie sollten erwähnen, dass der 'Schalter' es gawk-spezifisch macht. –

+0

Hi dieser Code funktioniert aber nicht genau was ich will. Ich möchte, dass die Elemente in einer Form wie dem Original zurückgegeben werden, d. H. In einer durch Tab oder ";" getrennten Zeichenfolge. nicht in neuen Zeilen. –

+0

@JanShamsani Aktualisiert. –

0

Immer wenn Sie name=value Paare haben, ist es normalerweise am einfachsten, zuerst ein Array zu erstellen, das Namen auf Werte abbildet (n2v[]) und dann können Sie einfach auf die Werte über ihren Namen zugreifen.

$ cat file 
AC=1;AC_AFR=2;AF=3 AC=4;AC_AFR=5;AF=6 

$ cat tst.awk 
{ 
    delete n2v 
    split($2,tmp,/[;=]/) 
    for (i=1; i in tmp; i+=2) { 
     n2v[tmp[i]] = tmp[i+1] 
    } 
    prt("AC") 
    prt("AF") 
} 
function prt(name) { print name, "=", n2v[name] } 

$ awk -f tst.awk file 
AC = 4 
AF = 6 

Gerade $2 für Ihren wirklichen Eingang $71 ändern.