Wie lassen sich Zeichenfolgen in zwei Dateien abgleichen und ersetzen?

Wie lassen sich Zeichenfolgen in zwei Dateien abgleichen und ersetzen?

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:Cals 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 splitden 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 OFSVariable 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 FSVariable 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.

verwandte Informationen