Ich habe file1 mag:
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 gesetzt wird.
text-processing
awk
join
bioinformatics
Dadong Zhang
quelle
quelle
Antworten:
Dies sollte es tun:
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:
Ausgabe:
Erklärung (von
info join
):Der obige Befehl verknüpft also die Dateien im zweiten Feld und druckt das erste, zweite und dritte Feld der ersten Datei, gefolgt vom dritten Feld der zweiten Datei.
quelle
Sie könnten verwenden
awk
:Ausgabe:
Erläuterung:
Gehen Sie durch
file2
(NR==FNR
gilt nur für das erste Dateiargument). Speicher Spalte 3 in Hash-Array mit Spalte 2 als Schlüssel:h[$2] = $3
. Gehen Sie dannfile1
alle drei Spalten durch und geben Sie sie aus$1,$2,$3
, indem Sie die entsprechende gespeicherte Spalte aus dem Hash-Array anhängenh[$2]
.quelle
h[$2] = $3
ist eine Hash-Zuweisung. Es wird$3
als Wert und$2
als Schlüssel gespeichert. Beispiel:h["name"] = "Dadong"
. Nunprint h["name"]
AusgängeDadong
. Es macht, was Sie wollen, es stimmt genau mit der zweiten Spalte aus beiden Dateien überein.Wenn Sie keine Bestellung benötigen, ist dies eine einfache Lösung
Dies setzt voraus, dass alle Zeilen drei Einträge haben und die Spalten 1 und 2 beider Dateien identisch sind (wie in Ihren Beispieldaten).
quelle
paste
paste
können Sie einen Weg finden, dies mit coreutils zu beantworten ?