2017-04-12 3 views
0

Nun, ich habe mehrere Dateien und ich habe Schwierigkeiten, sie mit awk zu verbinden. Hier sind drei Beispieldateien:Wie verbinde ich mehrere Dateien durch awk

FileA

2 2 31771 15 5327353  4.73E-04 1 1 
2 2 40642 23 27428869 -8.29E-04 1 1 
2 2 21517 7 89002990 -2.41E-04 1 1 
2 2 33787 16 44955568  2.86E-05 1 1 

FileB

2 2 31771 15 5327353  5.07E-04 1 1 
2 2 40642 23 27428869 5.45E-04 1 1 
2 2 21517 7 89002990 1.85E-04 1 1 
2 2 33787 16 44955568 3.73E-04 1 1 

FILEC

2 2 31771 15 5327353  4.28E-04 1 1 
2 2 40642 23 27428869 -7.55E-04 1 1 
2 2 21517 7 89002990 -2.01E-04 1 1 
2 2 33787 16 44955568 3.09E-05 1 1 

Jede Datei 8 Spalten hat, aber ich weiß nicht brauchen Spalten 1, 2 , 7 und 8. Die Spalten 3, 4 und 5 sind allen Dateien gemeinsam, dies sind vielleicht die Referenzspalten für joi ning die Dateien, und Spalte 6 wäre die unterschiedliche Information jeder Datei.

Finalfile

31771 15 5327353  4.73E-04 5.07E-04 4.28E-04 
40642 23 27428869 -8.29E-04 5.45E-04 -7.55E-04 
21517 7 89002990 -2.41E-04 1.85E-04 -2.01E-04 
33787 16 44955568 2.86E-05 3.73E-04 3.09E-05 

Ich habe versucht, die folgenden Befehle:

awk 'NR==FNR{a[$3]=$6;next}{print $3"\t"$4"\t"$5"\t"$6"\t"a[$3]}' FileA FileB FileC > Finalfile 

Aber leider funktioniert es nur mit zwei Dateien, und ich bekomme so etwas wie in der Regel, wie dies meine letzte Datei aussehen würde dies:

2 2 31771 15 5327353  4.73E-04 5.07E-04 
2 2 40642 23 27428869 -8.29E-04 5.45E-04 
2 2 21517 7 89002990 -2.41E-04 1.85E-04 
2 2 33787 16 44955568 2.86E-05 3.73E-04 

Kann jemand bitte helfen? Denken Sie daran, dass es mehrere Dateien (10) gibt, nicht nur drei. Vielen Dank!

Antwort

3

geben diesem einen Versuch:

awk '{a[$3FS$4FS$5]=a[$3FS$4FS$5]""$6FS}END{for (i in a){print i, a[i]}}' file* 

A Reiniger Version (Danke @ james-braun):

awk '{ a[$3 OFS $4 OFS $5 FS] = a[$3 OFS $4 OFS $5 FS] (a[$3 OFS $4 OFS $5 FS] == "" ? "" : OFS) $6 } 
    END{ for (i in a){print i,a[i]} }' OFS="\t" file* 

Ausgabe

33787 16 44955568 2.86E-05 3.73E-04 3.09E-05 
21517 7 89002990 -2.41E-04 1.85E-04 -2.01E-04 
40642 23 27428869 -8.29E-04 5.45E-04 -7.55E-04 
31771 15 5327353  4.73E-04 5.07E-04 4.28E-04 
+2

Ich schätze Kompaktheit mehr als der nächste Kerl, aber ich würde wahrscheinlich '{ a [$ 3 OFS $ 4 OFS $ 5] = a [$ 3 OFS $ 4 OFS $ 5] (a [$ 3 OFS $ 4 OFS $ 5] == ""? "": OFS) $ 6}. Anders als das <3. –

+2

Ja ziemlich ausdrucksvoller @JamesBrown +1 – klashxx

+0

Danke, ich schätze Ihre Hilfe Jungs. –

2

Paste + awk Ansatz (mit "hübsch" Ausgang):

paste fileA fileB fileC | awk '{print $3,$4,$5,$6,$14,$22}' | column -tx 

Der Ausgang:

31771 15 5327353 4.73E-04 5.07E-04 4.28E-04 
40642 23 27428869 -8.29E-04 5.45E-04 -7.55E-04 
21517 7 89002990 -2.41E-04 1.85E-04 -2.01E-04 
33787 16 44955568 2.86E-05 3.73E-04 3.09E-05 
Verwandte Themen