2016-07-07 8 views
1

Die unten awk scheint gut mit 1 Problem zu arbeiten, die Kopfzeilen in der Ausgabe hot print? Ich habe diese eine Weile ohne Glück gestarrt. Was vermisse ich? Vielen Dank :).awk nicht drucken header in der Ausgabedatei

awk

awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} FNR==1 || ($7 in a)' /home/panels/file1 test.txt | 
awk '{split($2,a,"-"); print a[1] "\t" $0}' | 
sort | 
cut -f2-> /home/panels/test_filtered.vcf 

test.txt (verwendet in der awk die gefilterte Ausgabe --only einen kleinen Teil der Daten zu geben, sondern die Lasche getrennten Format dargestellt ist)

Chr Start End Ref Alt 
chr1 949608 949608 G A 

Stromausgang (hat keine Kopfzeile)

chr1 949608 949608 G A 

gewünschter Ausgang (hat Header)

Chr Start End Ref Alt 
chr1 949608 949608 G A 
+1

können Sie auch ein Beispiel für file1 bereitstellen? Versuchen Sie auch, das Problem einzugrenzen, indem Sie die überflüssigen Pfeifen wie 'sort',' cut' und vielleicht eines der 'awk's entfernen. Das heißt, welcher Teil versagt genau? – fedorqui

+1

Ihre Header werden sortiert und sind wahrscheinlich mit Ihren Daten vermischt. –

+0

Die Header wurden mit den Daten vermischt und die Sortierung wurde entfernt. Kannst du bitte eine Antwort an @WilliamPursell machen, damit ich es annehmen kann? Danke :) – Chris

Antwort

2

Es sieht aus wie der Kopf sortieren wird, und immer mit Ihren Daten gemischt. Eine einfache Lösung ist zu tun:

... | { read line; echo $line; sort; } | 

zu verhindern, dass die erste Zeile zu sortieren.

+0

Vielen Dank :). – Chris

+0

Können Sie ein wenig erläutern, wie dies verhindert, dass die erste Zeile übersprungen wird? Ich teste es mit 'seq 2 10 | { Zeile lesen; Echo $ -Zeile; Sortieren; } 'und funktioniert gut, nur dass ich nicht wirklich verstehe, wie es funktioniert. – fedorqui

+1

'read line' liest Daten von stdin ein Zeichen nach dem anderen, bis es einen Zeilenumbruch sieht und speichert diese Zeile in der Variablen' line'. Dann druckt die Shell diese Zeile. Dann beginnt sort und verbraucht den Rest von stdin. Dieses Verhalten ist nur möglich, weil "read" genau ein Zeichen gleichzeitig liest, und ist (glaube ich) der Grund dafür, dass "read" sich so verhält. –

0

Sie können Ihre Skripte kombinieren und fügen Sie die Sortierung in awk und behandeln Header auf diese Weise.

$ awk 'NR==FNR{for(i=1;i<=NF;i++)a[$i]; next} 
     FNR==1{print "dummy\t" $0; next} 
     $7 in a{split($2,b,"-"); print b[1] "\t" $0 | "sort" }' file1 file2 | 
    cut -f2