2017-05-08 4 views
1

1. Zeit Buchung, also bitte geduldig mit mir ... Ich habe eine Liste von Namen und mehrere verschiedene Dateien (~ 600), die alle Namen enthalten oder nicht enthalten können Liste und ein Wert, der den Namen zugewiesen ist. Ich muss alle diese Werte von jeder Datei mit den Namen auf der Liste vergleichen. Dies sind die Art von TXT-Dateien Ich habeKombinieren mehrerer Textdateien in einer vergleichenden Weise

Liste

Alligator mississippiensis 
Anas platyrhynchos 
Anolis carolinensis 
Chrysemys picta 
Columba livia 
Gallus gallus 

File1

Alligator mississippiensis 2546 
Anas platyrhynchos 32 
Columba livia 21571 
Gallus gallus 226 

File2

Anas platyrhynchos 2 
Anolis carolinensis 3255 
Chrysemys picta 225 
Columba livia 2215 
Gallus gallus 22548 

Und das ist der Ausgang Ich suche, wo der Header wäre der Name der Dateien.

List File1,File2 
Alligator mississippiensis 2546,0 
Anas platyrhynchos 32,2 
Anolis carolinensis 0,3255 
Chrysemys picta 0,225 
Columba livia 21571, 2215 
Gallus gallus 226, 22548 

Ich dachte, so etwas wie grep die Saiten auf der Liste und wenn finden, Druckspalt 2 aus Datei *, und fügen Sie nacheinander, und wenn die Zeichenfolge nicht auf der Liste finden, druckt 0.

+1

Jedes Mal, wenn Sie sich denken 'grep finden und ...' oder 'sed und ...' Sie sollten Gänge schalten und starten 'nur awk' denken. –

+1

Ich fange an, das zu lernen! :) –

Antwort

2
awk ' 
BEGIN { OFS="," } 
{ list[$1 FS $2][ARGIND] = $3 } 
END { 
    printf "%s%s", ARGV[1], FS 
    for (fileNr=2; fileNr<=ARGIND; fileNr++) { 
     printf "%s%s", ARGV[fileNr], (fileNr<ARGIND ? OFS : ORS) 
    } 
    for (item in list) { 
     printf "%s%s", item, FS 
     for (fileNr=2; fileNr<=ARGIND; fileNr++) { 
      printf "%d%s", list[item][fileNr], (fileNr<ARGIND ? OFS : ORS) 
     } 
    } 
} 
' List File* 
List File1,File2 
Columba livia 21571,2215 
Chrysemys picta 0,225 
Anolis carolinensis 0,3255 
Gallus gallus 226,22548 
Anas platyrhynchos 32,2 
Alligator mississippiensis 2546,0 

Das obige verwendet GNU awk für ARGIND und echte mehrdimensionale Arrays.

Die Reihenfolge, in der die Artikel gedruckt werden, ist zufällig aufgrund des Operators in, leicht änderbar, wenn das ein Problem ist.

+1

Danke Ed, ich bekomme diesen Fehler, obwohl awk: cmd. Zeile: 5: (FILENAME = S234_A_trimmed_filtered_85.fq.vertebrate_other.tab.txt FNR = 1) fatal: Versuch, skalare 'list [" Chrysemys picta "] 'als Array zu verwenden. Ich dachte, das ist ein awk Fehler von einer schnellen Google-Suche, aber ich weiß nicht wirklich, wie man es repariert. –

+1

Super! Es hat perfekt funktioniert. –

1

anderen awk

$ awk   '{k=$1 FS $2} 
    NR==FNR {list[k]; next} 
    FNR==1 {f++} 
    k in list {a[k,f]=$3} 
    END  {for(k in list) 
        {printf "%s ",k; 
        for(i=1;i<=f;i++) printf "%s%s",a[k,i]+0,(i==f?ORS:",")}}' list file* | 
    sort 

Alligator mississippiensis 2546,0 
Anas platyrhynchos 32,2 
Anolis carolinensis 0,3255 
Chrysemys picta 0,225 
Columba livia 21571,2215 
Gallus gallus 226,22548 
+0

Ausgezeichnet! Ich bin überzeugt, dass awk der richtige Weg ist! Ich bin nur ein Anfänger, aber Sie haben mich interessiert! Vielen Dank! –

Verwandte Themen