2016-03-28 2 views
1

ich die zweite Säule (begrenzt durch ein Leerzeichen) in file1 vergleichen will:Vergleichen Spalten in zwei Textdateien und Übereinstimmungsleitungen

n01443537/n01443537_481.JPEG n01443537 
n01629819/n01629819_420.JPEG n01629819 
n02883205/n02883205_461.JPEG n02883205 

Mit der zweiten Spalte (begrenzt durch ein Leerzeichen) in file2:

val_8447.JPEG n09256479 
val_68.JPEG n01443537 
val_1054.JPEG n01629819 
val_1542.JPEG n02883205 
val_8480.JPEG n03089624 

Wenn es eine Übereinstimmung gibt, möchte ich die entsprechende Zeile von Datei2 ausdrucken.

gewünschte Ausgabe in diesem Beispiel:

val_68.JPEG n01443537 
val_1054.JPEG n01629819 
val_1542.JPEG n02883205 

ich folgendes versucht, aber die Ausgabedatei leer ist:

awk -F' ' 'NR==FNR{c[$2]++;next};c[$2] > 0' file1.txt file2.txt > file3.txt 

Auch dies versucht, aber das Ergebnis war das gleiche (leere Ausgabedatei):

awk 'NR==FNR{a[$2];next}$2 in a' file1 file2 > file3.txt 

Antwort

1

Mit awk:

Hier
awk 'FNR==NR{a[$NF]; next} $NF in a' file1 file2 

val_68.JPEG n01443537 
val_1054.JPEG n01629819 
val_1542.JPEG n02883205 

ist eine grep Alternative mit Prozess Substitution:

grep -f <(awk '{print " " $NF "$"}' file1) file2 

print " " $NF "$" Mit einem regulären Ausdruck wie " n01443537$" zu schaffen, so dass wir nur letzte Spalte in grep entsprechen.

+0

Hmm ... meine Ausgabe bleibt leider noch leer. Ich denke, das Problem könnte in meinen Quelldateien liegen. Wie kann ich überprüfen, ob die Spalten tatsächlich in jeder Zeile durch ein Leerzeichen begrenzt sind? Ich bin mir ziemlich sicher, dass sie das sind, aber vielleicht kann ich das überprüfen, um sicher zu sein. –

+1

Sie können 'cat -vte' auf beiden Dateien ausführen und prüfen, welche Zeichen vorhanden sind (möglicherweise aufgrund der DOS-Zeilenendung) – anubhava

+0

Wir könnten hier etwas unternehmen. Für Datei1 bekomme ich ein '$' an jede Zeile angehängt. Für Datei2 bekomme ich '^ M $' an jede Zeile angehängt. –

2

GNU join existiert für diesen Zweck.

join -o "2.1 2.2" -j 2 <(sort -k 2 file1) <(sort -k 2 file2)

+0

Cool, dachte nicht daran, 'Join' zu verwenden. Es funktioniert (noch) nicht, aber ich denke, das liegt an einem Problem mit meinen Eingabedateien. –

+2

1. Es wird Ausgabedaten nicht in der ursprünglichen Reihenfolge 2. Die Sortierung kann für große Dateien teuer sein – anubhava