2016-04-16 5 views
2

Ich versuche, eine neue Datei basierend auf einer Übereinstimmung zu output. In der input Datei gibt es eine Liste von IDs, die $5 vor der | Datei entsprechen. Wenn die beiden IDs übereinstimmen, ist die gesamte Zeile aus der Datei Teil der neuen Datei. Wenn keine Übereinstimmung gefunden wird, überspringt es sie und geht weiter. Die folgende Datei awk wird ausgeführt, aber die resultierende Datei new ist leer. Vielen Dank :).Update-Datei basierend auf Übereinstimmung von einer anderen Datei mit Hilfe von awk

Eingangs

DACH1 
POLE2 
GNG7 

Datei

chr13 60737711 60737910 chr13:60737711-60737910 DIAPH3-673|gc=69.3 
chr13 72337884 72338003 chr13:72337884-72338003 DACH1-674|gc=30.3 
chr19 2591538 2591657 chr19:2591538-2591657 GNG7-183|gc=48.7 

gewünschte Ausgangs

chr13 72337884 72338003 chr13:72337884-72338003 DACH1-674|gc=30.3 
chr19 2591538 2591657 chr19:2591538-2591657 GNG7-183|gc=48.7 

awk

awk 'BEGIN {FS=OFS="|"} NR==FNR{a[$1]=$5;next} $5 in a{$5=a[$1];print $0}' input file > new 
+1

Was denkst du, wenn du 'FS =" | "" machst? Zählen Sie nun die Anzahl der '|' getrennten Felder in Ihrer Eingabedatei. Was ist der Wert des 5. Feldes ($ 5) in jeder Zeile? Jetzt siehst du das Problem? –

+1

Danke @Ed Morton Ich sehe das Problem mit meinem 'awk' und dein' awk' ist sehr hilfreich :). – Chris

Antwort

2

Verwenden Sie stattdessen Grep.

Von dem, was ich sehen kann, möchten Sie nur die Zeilen in der Datei ausgeben, die einen übereinstimmungseintrag in der Eingabedatei haben. das ist die Welt von grep :) Die -f sagt ihr, dass sie eine Datei als Eingabemuster verwenden soll, jede Zeile in der Eingabedatei ist ein Muster.

HINWEIS: Verwenden Sie die Option -w (ganzes Wort Spiel), wenn Sie Matches bekommen, die so etwas wie GNG77-123 sind (weil es mit GNG7 beginnt) oder AGNG7-123 (weil es GNG7 drin) ..

+0

funktioniert gut, nicht so gut mit 'grep', aber es scheint sehr nützlich zu sein. Vielen Dank für die Erklärung und für Ihre Hilfe :) – Chris

+1

@Chris ist es in der Regel eine schlechte Idee, nur die erste Antwort zu akzeptieren oder überhaupt eine Antwort zu akzeptieren, ohne es ein paar Stunden nach dem Stellen Ihrer Frage zu geben, um eine Auswahl von Antworten alle zu sehen mit ihren Vor-und Nachteile. Ein Skript, das bei bestimmten Eingaben die erwartete Ausgabe erzeugt, ist der Ausgangspunkt, um eine Lösung und nicht den Endpunkt zu identifizieren. Diese spezielle Antwort wird leise interessante Fehler bei verschiedenen Inhalten Ihrer Dateien, so YMMV, wenn Sie beginnen, es auf Ihre realen Daten zu verwenden. Du warst mit awk auf dem richtigen Weg. –

+1

@Chris, froh, dass ich dich vorstellen könnte, grep, ich empfehle dir, andere Optionen für Grep zu sehen. und machen Sie die Muster in der Eingabedatei spezifischer, so dass Sie nicht das Problem bekommen, eine Zeile mit AGNG74-183 zu vergleichen, zum Beispiel weil Sie GNG7 in Ihrer Eingabedatei haben, achten Sie einfach darauf und lassen Sie uns wissen, wenn Sie irgendwelche Probleme haben:). – Rob

2
$ awk 'NR==FNR{a[$1];next} {k=$NF; sub(/-.*/,"",k)} k in a' input file 
chr13 72337884 72338003 chr13:72337884-72338003 DACH1-674|gc=30.3 
chr19 2591538 2591657 chr19:2591538-2591657 GNG7-183|gc=48.7 
+1

Vielen Dank für Ihre Hilfe :) – Chris

Verwandte Themen