2017-09-24 1 views
1

Ich habe eine Datei, die wie so aussieht:bash: Ausgabe Inhalt diff Funktion in 2 Spalten

file1.txt 
rs13339951:45007956:T:C 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576 5353566 

file2.txt 
rs13339951 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576:ATCFHF 5353566 

Weitere Beschreibungen:

  • Einige der Werte in column1 identisch sind zwischen den zwei Dateien aber nicht alle
  • Die Werte in column2 sind alle identisch zwischen den zwei Dateien

ich möchte identifizieren die Zeilen, für die sich die Werte in Spalte1 zwischen den beiden Dateien unterscheiden. I.e. diese Zeilen 1 und 4 in meinem Beispiel. Ich kann dies mit diff file1.txt und file2.txt tun.

Allerdings möchte ich eine Enddatei wie folgt erhalten (siehe unten). Tatsächlich ziele ich darauf, sed zu verwenden, um die Namen einer Datei in der anderen zu ersetzen, so dass beide Dateien vollständig übereinstimmen.

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 
+0

Was haben Sie versucht? Sie können dies mit "awk" oder möglicherweise "Join" tun. – codeforester

+0

Ich überlegte, etwas zu tun wie: diff file1.txt file2.txt | grep \^\ <| seds/< //' > part1.txt diff datei1.txt datei2.txt | grep \^\> | seds /> // '> part2.txt Und die irgendwie die 2 Dateien basierend auf Positionen, um eine Datei wie die oben genannten zu erhalten. Es scheint jedoch ziemlich ungeschickt und langweilig. Ich muss dies für mehr als 500 Dateien gleichzeitig tun, damit ein einzelner Befehl gut ist. – m93

Antwort

1

awk ist perfekt für diese

awk 'FNR==NR {a[$2]=$1; next} a[$2]!=$1 {print a[$2] " " $1}' file1 file2 

Ausgänge

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 

Wir zwei Dateien awk sind vorbei. Es wird nacheinander über sie hinweggehen.

FNR==NR {.... next} { ... } 

Mit diesem "Trick" wird die erste Aktion für die erste Datei und die zweite Aktion für die zweite Datei ausgeführt.

a[$2]=$1 

Eine Schlüsselwert-Nachschlagetabelle. Zweite Spalte ist Schlüssel erste Spalte ist Wert. Wir erstellen diese Nachschlagetabelle beim Lesen der ersten Datei.

Vergleichen Sie beim Iterieren über die zweite Datei die aktuelle erste Spalte mit dem Wert in der Nachschlagetabelle. Wenn sie nicht übereinstimmen, drucken Sie die gewünschte Ausgabe.

+0

Danke! Wäre es möglich, dass Sie genau erklären, was jeder Teil dieses Codes tut? Ich bin ziemlich neu zu Bash, also bin ich nicht sicher, was genau jeder Teil Ihres Befehls macht – m93

+0

@ m93 Meine Antwort aktualisiert. Lassen Sie mich wissen, wenn weitere Fragen bestehen. –

+0

Vielen Dank, das ist wirklich hilfreich! – m93