Verknüpfen, fehlende Schlüsselwerte ergänzen

Verknüpfen, fehlende Schlüsselwerte ergänzen

Ich habe zwei Dateien, die als erstes Feld einen Primärschlüsselwert und als restliche Felder einen oder mehrere entsprechende Werte haben. In einer davon fehlen einige Primärschlüsselwerte, in einer anderen sind sie jedoch vorhanden und umgekehrt:

$ cat jointest1.txt jointest2.txt  
a 1  
b 2  
d 4  
e 5    

a 10  
b 11  
c 12  
d 13  

Ich würde eine Ausgabe erwarten, die diese Dateien gemäß einem Primärschlüssel zusammenführt und dabei die fehlenden Werte entweder ersetzt oder nicht, etwa:

$ joinmerge  jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
c - 12  
d 4 13  
e 5 -

Die Möglichkeit, fehlende Werte durch Bindestriche oder ähnliches zu ersetzen, ist optional.

Ich habe es versucht join, aber es heißt, meine Dateien seien nicht richtig sortiert:

$ join jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
join: file 2 is not in sorted order  
d 4 13  

Welchen Befehl sollte ich stattdessen verwenden?

Antwort1

Versuche Folgendes:

> join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2
a a 1 a 10
b b 2 b 11
c - - c 12
d d 4 d 13
e e 5 - -

oder

> join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2
a 1 10
b 2 11
c - 12
d 4 13
e 5 -

Ich bin mir nicht sicher, ob/wie es möglich ist, dasselbe ohne die Option -o zu erreichen. Die Option -o besagt: Zuerst das Verbindungsfeld drucken, dann Feld Nr. 2 aus Datei 1, dann Feld 2 aus Datei 2. Schade, dass man das Format der Dateien kennen muss, damit die leeren Felder funktionieren.

Antwort2

Welche Implementierung von joinverwenden Sie? Mit join (GNU coreutils) 5.97kann ich verwenden

[0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt
a 1 10
b 2 11
c 12
d 4 13
e 5 

und der „einfache“ Join funktioniert auch (lässt aber c und e aus). Es gibt eine -eOption, mit der Sie angeblich den Marker für leere Felder auswählen können, aber sie scheint in meiner Version defekt zu sein und füllt nur den Fall e aus, nicht den Fall c.

Antwort3

Ich habe ein Perl-Tool für genau dieses Schlüssel-Wert-Problem geschrieben:

Die richtigen Reihen paaren: beliebig viele Dateien. Es ist auch verfügbar überGitHub.

Um es auszuführen, geben Sie Folgendes ein:

merge -k -e "-" jointest1.txt jointest2.txt

verwandte Informationen