Inner join auf zwei text-Dateien
Suchen zum durchführen einer inner join auf zwei verschiedene text-Dateien. Im Grunde bin ich auf der Suche für den inner join entspricht der GNU-join-Programm. Gibt es das noch? Wenn nicht, wird ein awk
oder sed
Lösung wäre sehr hilfreich, aber meine erste Wahl wäre ein Linux-Befehl.
Hier ist ein Beispiel was ich Suche zu tun
Datei 1:
0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
0|App - CSCE Certificate LUA|Admit Type
1|App - CSCE Certificate LUA|Alias 1
2|App - CSCE Certificate LUA|Alias 2
3|App - CSCE Certificate LUA|Alias 3
4|App - CSCE Certificate LUA|Alias 4
Datei 2:
Alien Registration Card LUA
Ergebnisse:
0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte nicht die Datei2 enthalten
LUA
am Ende?Wenn ja, können Sie immer noch
join
:Sieht aus wie Sie brauchen nur
Hier ist ein awk-option, so können Sie vermeiden, die bash-Abhängigkeit (Portabilität):
Wie funktioniert das?
-F'|'
-- setzt den Feld-separator'NR==FNR{check[$0];next}
- wenn die total-record-Nummer entspricht der Datei-Datensatznummer (d.h. wir Lesen die erste Datei), dann werden wir füllen ein array und weiter.$2 in check
-- Wenn das zweite Feld erwähnt wurde, in das array, die wir erstellt haben, drucken Sie die Zeile (das ist die default-Aktion, wenn keine Maßnahmen vorgesehen sind).file2 file1
-- die Dateien. Die Reihenfolge ist wichtig wegen derNR==FNR
konstruieren.Können Sie dieses Skript so ändern:
while-Schleife liest Datei2 Zeile für Zeile und gibt diese Zeile an den grep-Befehl, greps, dass die Zeile in Datei1. Es sind einige extra-Ausgabe, die vielleicht entfernt mit grep-Optionen.
$line
. Wenn es Leerzeichen enthält, könnte es erweitert werden schlecht. Auch, wenn Sie auf der Suche für eine Feste Zeichenkette, anstatt reguläre Ausdrücke (denken Sie daran, es ist gREp), dann verwenden Sie die-F
option.grep
das liest sich in den mustern und prüft dann die Ziel-Datei nur einmal ist erheblich effizienter als der Betrieb einesgrep
für jedes Muster, besonders natürlich für große Eingänge.grep ^$line\$ file1
zu vermeiden Teilzeichenfolge übereinstimmt.grep -Fx
(-F
= fester string (not regexp),-x
= line-match).Können Sie "einfügen" - Befehl zu kombinieren Datei :
für dein Beispiel wäre es