Erlernen von Linux-Befehlen: join
Einleitung
join ist ein weiteres Beispiel für ein Textverarbeitungsprogramm unter GNU/Linux. join kombiniert zwei Dateien basierend auf den übereinstimmenden Inhaltszeilen, die in jeder Datei gefunden wurden. Die Verwendung des Join-Befehls ist recht einfach und wenn er aktuell und in der richtigen Situation verwendet wird, kann er viel Zeit und Mühe sparen. Für diesen Artikel sind sehr grundlegende Kenntnisse in der Befehlszeile erforderlich.
Häufig verwendete Optionen
- -1 FIELD
Join auf dem angegebenen Feld in Datei 1 - -2 FIELD
Join für das angegebene Feld in Datei 2 - -t CHAR
CHAR als Ein- und Ausgabetrennzeichen verwenden
Grundlagen
Die grundlegende Verwendung des Befehls join ist die Verwendung ohne Optionen. Alles, was erforderlich ist, ist, 2 Dateien als Argumente anzugeben. Nehmen wir an, wir haben zwei Dateien A.txt und B.txt mit folgendem Inhalt:
cat A.txt
1 A
2 B
3 C
cat B.txt
1 John
2 Linda
3 Rares
Hier können wir sehen, dass das erste Feld ein perfekter Kandidat ist, um eine Verknüpfungsoperation durchzuführen. Standardmäßig führt der Join-Befehl einen Join-Vorgang für ein erstes FIELD durch, bei dem das Feldtrennzeichen ein einzelnes Leerzeichen oder TAB ist. Daher werden durch Ausführen eines folgenden Linux-Befehls unsere beiden Dateien basierend auf FELD 1 verknüpft:
join A.txt B.txt
1 A John
2 B Linda
3 C Rares
Auswahl von FIELD
In unserem vorherigen Beispiel sehen Sie eine Standardfunktion eines join-Befehls. In diesem Abschnitt werden wir sehen, wie wir ein anderes Feld angeben können, für das der Join-Befehl eine Verbindungsoperation ausführen soll. Betrachten wir die folgenden A.txt und B.txt Dateien:
cat A.txt
John A 1
Linda B 2
Rares C 3
cat B.txt
1 A
2 B
3 C
Wie wir sehen können, stimmt in diesem Fall die erste Standardverknüpfung FIELD nicht mehr überein. Daher wird beim Ausführen eines join-Befehls für diese beiden Dateien keine Ausgabe erzeugt. Wir können jedoch auch sehen, dass das zweite Feld in der ersten Datei mit dem zweiten Feld in der zweiten Datei übereinstimmt. Als Ergebnis können wir das Standardverhalten des Join-Befehls ändern und beide Dateien basierend auf dem zweiten FIELD in jeder Datei verbinden:
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
wobei -1 eine erste Datei und 2 ein zweites FIELD und -2 eine zweite Datei und 2 eine zweite Spalte ist. In diesem Fall können wir, nur weil beide übereinstimmenden Felder an zweiter Stelle stehen, -j als Abkürzung verwenden.
join -j 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
Wie Sie bereits bemerkt haben, können auch ein drittes FIELD und erstes FIELD in beiden Dateien für eine Join-Operation verwendet werden.
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
join -1 3 -2 1 A.txt B.txt
1 John A A
2 Linda B B
3 Rares C C
Es ist wichtig zu beachten, dass der Join-Befehl vom letzten bis zum Beispiel immer das passende FIELD als erstes ausgibt.
Wählen des FIELD-Trennzeichens
Nun, nicht alle Dateien sind für einen Join-Befehlsvorgang gut formatiert. Wie bereits erwähnt, ist das Standard-FIELD-Trennzeichen das Leerzeichen. Aber was ist, wenn wir ", " ( Komma ) oder sogar TAB als Trennzeichen haben? Betrachten wir die folgenden Dateien:
cat A.txt
John,A,1
Linda,B,2
Rares,C,3
cat B.txt
1,A
2,B
3,C
In diesem Fall besteht der einzige Unterschied zu den vorherigen Beispielen darin, dass das FIELD-Trennzeichen " " ist. Um dem Join-Befehl mitzuteilen, welches FIELD-Trennzeichen verwendet werden soll, können wir die Option -t nutzen, ansonsten ist die Syntax gleich:
join -t, -1 3 -2 1 A.txt B.txt
1,John,A,A
2,Linda,B,B
3,Rares,C,C
Mehrere Leerzeichen
Wenn Ihre Dateien mehrere Leerzeichen als FIELD-Trennzeichen haben, ist es am sichersten, sie in ein einzelnes Leerzeichentrennzeichen zu konvertieren. Zum Beispiel kann es ziemlich schwierig sein, diese Dateien zu verbinden:
cat A.txt
John A 1
Linda B 2
Rares C 3
cat B.txt
1 A
2 B
3 C
Daher können Sie, wenn die Situation es Ihnen erlaubt, sie mit dem Befehl sed in eine durch einzelne Leerzeichen getrennte Datei konvertieren:
sed -i 's/\s\+/ /g' A.txt
sed -i 's/\s\+/ /g' B.txt
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
Tabulatortaste für ein FIELD-Trennzeichen
Das Tabulatortrennzeichen wird auch vom Befehl join als Standard akzeptiert. Daher wird im folgenden Beispiel ein gültiger Verknüpfungsvorgang ausgeführt:
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
join -1 3 -2 1 A.txt B.txt
1 John A A
2 Linda B B
3 Rares C C
Groß-/Kleinschreibung ignorieren
Wenn Ihr übereinstimmendes FIELD in perfekter Reihenfolge ist, aber FIELDS aus beiden Dateien Unterschiede in Groß- und Kleinschreibung aufweisen, führt die Verknüpfung keine gültige Verknüpfungsoperation durch und ignoriert nicht übereinstimmende Zeilen, es sei denn, -i ( Groß-/Kleinschreibung ignorieren ) wird verwendet. Beachten Sie im folgenden Beispiel den folgenden Kleinbuchstaben b:
cat A.txt B.txt
John A 1
Linda b 2
Rares C 3
1 A
2 B
3 C
join -1 2 -2 2 A.txt B.txt
A John 1 1
C Rares 3 3
join -i -1 2 -2 2 A.txt B.txt
A John 1 1
b Linda 2 2
C Rares 3 3
Überschreiben des Standard-Join-Formats
Im folgenden Beispiel sehen wir, wie wir das Formatverhalten eines Standard-Join-Befehls mit der Option -o überschreiben können. Betrachten Sie eine Join-Ausgabe von Dateien A.txt und B.txt:
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
Das Verbindungsfeld wird als erstes gedruckt. Was ist, wenn wir das verbindende FIELD überhaupt nicht drucken möchten oder was ist, wenn wir das verbundene Feld in einer anderen Reihenfolge drucken möchten? In diesem Fall ist die Option -o FORMAT sehr praktisch. In diesem Beispiel drucken wir nur übereinstimmende Felder:
- erstes Feld in der ersten Datei: 1.1
- erstes Feld in zweiter Datei: 2.1
join -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Nicht paarbare Leitungen
Standardmäßig werden nur paarbare Zeilen mit dem Befehl join gedruckt. -a weist den Befehl join an, auch nicht übereinstimmende Zeilen einzuschließen. Im nächsten Beispiel drucken wir alle nicht übereinstimmenden Zeilen in Datei 1.
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
Lubos D 4
1 A
2 B
3 C
5 E
join -a 1 -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Lubos
Oder wir drucken alle nicht paarbaren Zeilen aus beiden Dateien durch:
join -a 1 -a 2 -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Lubos
5