2017-04-01 7 views
0

Ich habe ein grundlegendes Niveau von Unix zu verstehen, so dass dieses Problem einfach sein könnte.AWK Befehl zum Vergleich zweier Dateien, Bericht Zeile der ersten Datei, wenn nicht in der zweiten Datei gefunden, Bericht Zeile der zweiten Datei, wenn gefunden

Ich habe versucht, den "awk" -Befehl zu verwenden, um zwei Dateien zu vergleichen (zwei Spalten in jeder Datei getrennt durch eine Registerkarte) mit dem Ziel, eine Datei mit allen Zeilen der Datei 1 zu haben Zeile in der Datei 2, ich mochte die Zeile der Datei 1 ersetzt wird mit derselben Zeile aus der Datei 2.

File 1: 
Supercontig_12.1,420 0 
Supercontig_12.1,421 0 
Supercontig_12.1,422 0 
Supercontig_12.1,423 0 
…(rows continue in numerical order) 
Supercontig_12.1,428 0 
Supercontig_12.1,429 0 
Supercontig_12.1,430 0 

File 2 (not in numerical order): 
Supercontig_12.1,422 0.6 
Supercontig_12.1,426 0.333333 
Supercontig_12.1,428 0.5 
Supercontig_12.1,429 0 

gewünschter Ausgang

Output: 
Supercontig_12.1,420 0 
Supercontig_12.1,421 0 
Supercontig_12.1,422 0.6 
Supercontig_12.1,423 0.333333 
… 
Supercontig_12.1,428 0.5 
Supercontig_12.1,429 0 
Supercontig_12.1,430 0 

I wurde mit dem folgenden Befehl gefunden wird, aber es fügt nur die Zeilen der Datei 2 am Ende der Zeilen von Datei 1 hinzu, ähnlich wie die "cat" -Komm und.

$ awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt > output.txt 

Ich weiß, ich mache einen Array die Größe der Datei 1, das ist, was ich tun möchte, aber ich bin nicht für die Datei-2-Daten innerhalb dieses Array auswählen. Jede Hilfe wäre sehr willkommen. Danke im Voraus.

Andy

+0

Kann Datei2 Datensätze in Datei1 fehlen? Ist der Wert in Datei1 immer 0? –

+0

Hallo Walter, vielen Dank für deine Fragen. Um zu antworten, die zweite Spalte in Datei1 ist immer eine Null, da ich versuche, Daten in eine "leere" Spalte einzugeben, und nein, die Datensätze in Datei2 werden immer in Datei1 gefunden, es ist nur, dass Datei1 Zeilen nicht gefunden haben kann in Datei2. – adklocko

Antwort

0

Wenn alle Linien die gleiche Länge (nicht Supercontig_12.1,420 und Supercontig_12.1,4202) können Sie grep und cut: Sie können das erste Feld von file2 mit

cut -f1 file2.txt 

Die Ausgabe dieses Befehls erhalten kann verwendet werden, als wäre es eine Datei mit Prozesssubstitution <(some_command).
Um diese Linien von file1.txt

grep -vf <(cut -f1 file2.txt) file1.txt 

Setzen Sie diese zusammen mit Datei2 und sortieren das Ergebnis

cat file2.txt <(grep -vf <(cut -f1 file2.txt) file1.txt) |sort 

zu entfernen Was mit Ihrem awk falsch ist?

awk -F"\t" 'NR==FNR{a[$1]} $1 in a{print $1 "\t" $2}' file1.txt file2.txt 

Beim Analysieren von Datei1.txt möchten Sie nichts drucken. Verwenden Sie next. Und $ 0 speichern:

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{print $1 "\t" $2}' file1.txt file2.txt 

Wenn $ 1 von file2.txt in a gefunden wird, um den Wert ersetzen (nicht gedruckt noch)

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0}' file1.txt file2.txt 

Wenn alles analysiert wird, drucken Inhalt des Arrays.

awk -F"\t" 'NR==FNR{a[$1]=$0; next} $1 in a{a[$1]=$0} END { for (i in a) print a[i] } ' file1.txt file2.txt 
+0

Danke Walter! Dein Vorschlag hat fast perfekt funktioniert. Das einzige Problem: Die Ausgabedatei von Ihrem Druck-Array ist nicht numerisch sortiert und erscheint ziemlich zufällig in Gruppen.Ich habe versucht, die Datei "-n -k1" zu sortieren, aber dann erhöhen sich die Zahlen nach dem Komma von ", 1" nach ", 10" nach ", 100" nach ", 1000" nach ", 1001" ... Gibt es a Möglichkeit, die Spalten entweder numerisch zu drucken oder einen sekundären Befehl innerhalb von sort auszuführen, um sie numerisch zu setzen? Danke für Ihre Hilfe! – adklocko

+0

Ich denke, ich habe es verstanden, Walter (ich hätte etwas mehr recherchieren müssen, bevor ich meine Antwort eintippte). Der Befehl 'sort -t', '-k2n output_file.txt' funktioniert, um zu tun, was ich will. Wie auch immer, du hast mir mit deiner schön detaillierten Erklärung immens geholfen. Vielen Dank für deine Zeit, die du hineingesteckt hast! – adklocko

Verwandte Themen