Ich habe überall gesucht, aber ich habe immer noch nicht die Antwort, die ich suche. Ich habe folgende pdb-Datei (file1):Bash - Ersetzen mehrerer Zeilen in einer Datei mit einer einzelnen Zeile aus einer anderen Datei
ATOM 1 N SER A 1 31.848 -5.217 38.114 1.00 39.55
ATOM 2 CA SER A 1 31.668 -5.130 36.630 1.00 40.83
ATOM 3 C SER A 1 30.991 -3.833 36.183 1.00 40.24
ATOM 4 O SER A 1 30.868 -2.883 36.961 1.00 40.08
ATOM 5 CB SER A 1 30.854 -6.329 36.118 1.00 41.46
ATOM 6 OG SER A 1 31.600 -7.531 36.190 1.00 44.54
ATOM 7 N THR A 2 30.605 -3.796 34.906 1.00 39.92
ATOM 8 CA THR A 2 29.920 -2.658 34.286 1.00 38.97
ATOM 9 C THR A 2 28.542 -3.116 33.777 1.00 38.40
ATOM 10 O THR A 2 27.815 -2.341 33.141 1.00 38.79
ATOM 11 CB THR A 2 30.734 -2.067 33.086 1.00 39.67
ATOM 12 OG1 THR A 2 31.045 -3.101 32.139 1.00 38.83
ATOM 13 CG2 THR A 2 32.020 -1.403 33.566 1.00 38.83
Ich habe auch die folgende Datei nach einiger Berechnung mit gfortran (file2):
1 0.14364205034979632
2 0.50527753403393372
Was ich möchte, ist tun Spalte ersetzen 11 von Datei1 mit Spalte 2 von Datei2, solange Spalte 6 von Datei1 gleich Spalte 1 von Datei2 ist. Im Wesentlichen sollte die Ausgabe wie folgt sein:
ATOM 1 N SER A 1 31.848 -5.217 38.114 1.00 0.14364205034979632
ATOM 2 CA SER A 1 31.668 -5.130 36.630 1.00 0.14364205034979632
ATOM 3 C SER A 1 30.991 -3.833 36.183 1.00 0.14364205034979632
ATOM 4 O SER A 1 30.868 -2.883 36.961 1.00 0.14364205034979632
ATOM 5 CB SER A 1 30.854 -6.329 36.118 1.00 0.14364205034979632
ATOM 6 OG SER A 1 31.600 -7.531 36.190 1.00 0.14364205034979632
ATOM 7 N THR A 2 30.605 -3.796 34.906 1.00 0.50527753403393372
ATOM 8 CA THR A 2 29.920 -2.658 34.286 1.00 0.50527753403393372
ATOM 9 C THR A 2 28.542 -3.116 33.777 1.00 0.50527753403393372
ATOM 10 O THR A 2 27.815 -2.341 33.141 1.00 0.50527753403393372
ATOM 11 CB THR A 2 30.734 -2.067 33.086 1.00 0.50527753403393372
ATOM 12 OG1 THR A 2 31.045 -3.101 32.139 1.00 0.50527753403393372
ATOM 13 CG2 THR A 2 32.020 -1.403 33.566 1.00 0.50527753403393372
Ich habe den folgenden Code:
gawk '
FNR==NR { pdb[NR]=$0; next }
{
split(pdb[FNR],flds,FS,seps)
while (flds[6]==$1) {
flds[11]=$2
for (i=1;i in flds;i++)
printf "%s%s", flds[i], seps[i]
print ""
}
}
' "file1" "file2" > "output.pdb"
Es wird die Arbeit für die erste Zeile von file1 getan und hält den Abstand konstant. Das Problem ist, dass es nicht zu den nächsten Zeilen weitergeht und die erste Zeile wird auch ständig wiederholt. Könnte jemand so freundlich sein, mir zu helfen?
Danke! Ich würde dich für etwas Bier behandeln :)
Sie sind ziemlich verwirrt darüber, wie awk funktioniert und es ist Syntax. Ich empfehle das Buch Effective Awk Programming, 4. Edition von Arnold Robbins, um etwas über awk zu lernen. –
@EdMorton: Ich bin eigentlich neu mit awk und ich habe gerade dieses Stück Code aus dem Internet. Wenn ich Zeit hätte, würde ich gerne Ihre vorgeschlagene Referenz überprüfen. Prost! ~ – ajthealchemist
Es gibt ** FAR ** mehr schlechten Code als guten Code im Internet. Stellen Sie sicher, dass Sie die Quelle auschecken, bevor Sie versuchen, den Code, den Sie online finden, zu verwenden, da er bestenfalls fehlerhaft und oft gefährlich ist. SO ist übersät mit akzeptierten "Antworten", die Ihr Dateisystem oder ähnliches bei einigen Eingaben bereinigen. Oder es könnte für eine Anwendung gut sein, aber schlecht für Ihre. Und natürlich sollten Sie immer zuerst eine empfohlene/vertrauenswürdige Quelle lesen, um ein grundlegendes Verständnis für jedes Werkzeug/jede Sprache zu erhalten, die Sie verwenden möchten, damit Sie eine Chance haben, den guten Code vom schlechten zu trennen. –