
Ich habe eine Datei wie diese: (hat 308545 Zeilen)
head output11.frq
CHR SNP A1 A2 MAF NCHROBS
1 1:775852:T:C T C 0.1707 3444
1 1:1120590:A:C C A 0.08753 3496
1 1:1145994:T:C C T 0.1765 3496
1 1:1148494:A:G A G 0.1059 3464
1 1:1201155:C:T T C 0.07923 3496
...
Und eine weitere Datei (Marker-Info), die die ersten 24 Zeilen kommentiert und durch Kommas getrennt hat und so aussieht (hat insgesamt 500593 Zeilen):
1,742429,SNP_A-1909444,ss66079302,rs3094315,36.2,G,A,C,T,A,GCACAGCAAGAGAAAC[A/G]TTTGACAGAGAATACA,Sty,+,-,y,,,127,phs000018
1,769185,SNP_A-4303947,ss66273559,rs4040617,36.2,A,G,A,G,A,GCTGTGAGAGAGAACA[A/G]TGTCCCAATTTTGCCC,Sty,+,+,n,,,127,phs000018
1,775852,SNP_A-1886933,ss66317030,rs2980300,36.2,T,C,A,G,A,GAATGACTGTGTCTCT[C/T]TGAGTTAGTGAAGTCA,Nsp,-,+,y,,,127,phs000018
1,782343,SNP_A-2236359,ss66185183,rs2905036,36.2,C,T,C,T,A,CTCGATTTGTGTTCAA[C/T]ATATTTCATTTGTACC,Sty,-,-,n,,,127,phs000018
1,1201155,SNP_A-2205441,ss66174584,rs4245756,36.2,C,T,C,T,A,CCAGTGCTTTCAACCA[C/T]ACTCACTTTTCACTGT,Sty,+,+,n,,,127,phs000018
...
Ich möchte in output11.frq die zweite Spalte durch die 5. Spalte in marker-info ersetzen, die in der 1. und 2. Spalte den entsprechenden Wert hat, sodass das Ergebnis von output11.frq für dieses Beispiel folgendermaßen aussehen würde:
1 rs2980300 T C 0.1707 3444
1 rs4245756 T C 0.07923 3496
Ich habe dies versucht, aber ich habe eine leere Datei erhalten:
vi tst.awk
NR==FNR { map[$1,$2]=$5; next }
($1,$4) in map { $2=map[$1,$4]; print }
awk -f tst.awk FS=',' marker-info FS='\t' output11.frq > output11X.frq
BEARBEITEN:
Ich habe versucht, dies auszuführen:
vi test2.awk
NR==FNR { map[$2]=$5 }
NR!=FNR { split($4, x, ":"); if(x[2] in map){ $4=map[x[2]]; print }}
awk -f test2.awk FS=',' marker-info FS='\t' output11.frq > output11X.frq
aber ich habe das hier bekommen:
head output11X.frq
CHR SNP A1 A2 MAF NCHROBS rs41340551
1 1:775852:T:C T C 0.1707 3444 rs41340551
1 1:1120590:A:C C A 0.08753 3496 rs41340551
1 1:1145994:T:C C T 0.1765 3496 rs41340551
...
Antwort1
Das Problem mit Ihrem Skript bestand darin, dass Sie versuchten, Zeichenfolgen wie 11:775852:T:C
als Schlüssel in einer Karte zu verwenden, deren Schlüssel das Format haben 775852
.
Ich habe die erste Spalte aus dieser Verarbeitung weggelassen, da Sie in einem Kommentar erwähnt haben, dass Sie sie nicht für erforderlich halten.
NR==FNR { map[$2]=$5 }
NR!=FNR { split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}
Früher habe ich split
den relevanten Teil der Zeichenfolge abgerufen und eine Bedingung hinzugefügt, da es bis zur Verarbeitung dieser Teilzeichenfolge keine Möglichkeit gibt, die erforderliche Suche durchzuführen.
Dies scheint wie gewünscht zu funktionieren:
[gnubeard@mothership: ~/dna]$ awk -f test.awk FS=',' marker-info FS=' ' output11.frq
1 rs2980300 T C 0.1707 3444
1 rs4245756 T C 0.07923 3496
Stellen Sie sicher, dass die vorhandenen Felder mit den Spalten übereinstimmen, die Sie vermuten. Wenn Sie möchten, dass die Ausgabe tabulatorgetrennt ist, können Sie die OFS
Variable in der zweiten Hälfte des Skripts wie folgt festlegen:NR!=FNR { OFS="\t"; split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}
BEARBEITEN: Ich habe die FS
Variable im Befehl geändert, um das Trennzeichen für output11.frq in ein Leerzeichen zu ändern. Dadurch wird Fummelei mit der Anzahl der Tabulatoren vermieden.