it-swarm.com.de

Wie füge ich zwei Dateien zusammen, basierend auf dem Abgleich zweier Spalten?

Ich habe file1 Likes:

0   AFFX-SNP-000541  NA
0   AFFX-SNP-002255  NA
1   rs12103          0.6401
1   rs12103_1247494  0.696
1   rs12142199       0.7672

Und eine Datei2:

0   AFFX-SNP-000541   1
0   AFFX-SNP-002255   1
1   rs12103           0.5596
1   rs12103_1247494   0.5581
1   rs12142199        0.4931

Und möchte eine Datei3 so, dass:

0   AFFX-SNP-000541     NA       1
0   AFFX-SNP-002255     NA       1
1   rs12103             0.6401   0.5596
1   rs12103_1247494     0.696    0.5581
1   rs12142199          0.7672   0.4931

Dies bedeutet, dass die 4. Spalte von Datei2 mit dem Namen der 2. Spalte in Datei1 eingefügt wird.

32
Dadong Zhang

Dies sollte es tun:

join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2

Wichtig: Dies setzt voraus, dass Ihre Dateien (wie in Ihrem Beispiel) nach dem SNP-Namen sortiert sind. Wenn dies nicht der Fall ist, sortieren Sie sie zuerst:

join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)

Ausgabe:

0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

Erklärung (von info join):

`join 'schreibt in die Standardausgabe eine Zeile für jedes Paar von Eingabezeilen mit identischen Verknüpfungsfeldern.

`-1 FIELD'
     Join on field FIELD (a positive integer) of file 1.

`-2 FIELD'
     Join on field FIELD (a positive integer) of file 2.

`-j FIELD'
     Equivalent to `-1 FIELD -2 FIELD'.

`-o FIELD-LIST'

 Otherwise, construct each output line according to the format in
 FIELD-LIST.  Each element in FIELD-LIST is either the single
 character `0' or has the form M.N where the file number, M, is `1'
 or `2' and N is a positive field number.

Der obige Befehl verbindet also die Dateien im zweiten Feld und druckt das erste, zweite und dritte Feld der ersten Datei, gefolgt vom dritten Feld der Datei2.

49
terdon

Sie könnten awk verwenden:

$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3

ausgabe:

$ cat file3
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

Erläuterung:

Gehen Sie durch file2 (NR==FNR gilt nur für das erste Dateiargument). Speichern Sie Spalte 3 im Hash-Array mit Spalte 2 als Schlüssel: h[$2] = $3. Dann gehen Sie durch file1 und alle drei Spalten ausgeben $1,$2,$3, Anhängen der entsprechenden gespeicherten Spalte aus dem Hash-Array h[$2].

17
grebneke

Wenn Sie keine Bestellung benötigen, wäre eine einfache Lösung

paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3

Dies setzt voraus, dass alle Zeilen drei Einträge haben und die Spalten 1 und 2 beider Dateien identisch sind (wie in Ihren Beispieldaten).

6
Bernhard