2017-12-22 2 views
0

Ich versuche, zwei Dateien auf einer Spalte zu verbinden, sondern verbinden und Befehl zu sortieren gibt mir folgende Ausgabe:Wie zwei separate Dateien in einer entsprechenden Spalte zu verbinden?

join: file 1 is not in sorted order 

Datei 1:

TEST->Infrastructure->Global Windows Server, OI-QASDWDASDWQWD, 
TEST->Infrastructure->Global Windows Server, OI-WASDWDASDWWWW, 
TEST->Infrastructure->zSeries_MVS, REGAA638G0K, 
TEST->Infrastructure->zSeries_MVS, REGAA55410K, 

File 2:

SERVER1; Deployed; REGAA638G0K; 
SERVER2; Deployed; OI-WASDWDASDWWWW; 
SERVER3; Delete; OI-QASDWDASDWQWD; 
SERVER4; Delete; REGAA55410K; 

Erwartete Datei 3:

SERVER1; Deployed; TEST->Infrastructure->zSeries_MVS; 
SERVER2; Deployed; TEST->Infrastructure->Global Windows Server; 
SERVER3; Delete; TEST->Infrastructure->Global Windows Server; 
SERVER4; Delete; TEST->Infrastructure->zSeries_MVS; 

Mein Befehl:

join -1 2 -2 3 -o 1.1,2.1,2.2 <(sort -t"," -k2 spmGroupsModifiedSCLine.out) <(sort -t";" -k3 spmCompStatJoined.out) 

Die zweite Spalte in der ersten Datei und der dritten Spalte in der zweiten Datei sind die gleichen, so dass es zuerst Ich versuche, auf sie zu verbinden und sortieren. Siehst du einen anderen Weg, den Beitritt zu machen? Vielen Dank !

Antwort

0

Awk Lösung:

awk 'NR==FNR{ a[$2]=$1; next }$3 in a{ print $1,$2,a[$3] }' FS=',' file1 FS=';' OFS='; ' file2 

Der Ausgang:

SERVER1; Deployed; TEST->Infrastructure->zSeries_MVS 
SERVER2; Deployed; TEST->Infrastructure->Global Windows Server 
SERVER3; Delete; TEST->Infrastructure->Global Windows Server 
SERVER4; Delete; TEST->Infrastructure->zSeries_MVS 
+0

Ist es möglich, jene Spalten zu verlassen, die nicht in einer Datei auch beigetreten sind? Bis jetzt, wie ich sehe, zeigt es nur die Daten, die verbunden sind. – Robbac

0

nicht so elegant wie die awk Lösung, aber vielleicht mehr intuitiv:

cat file2 | while read line; do 
    key=$(cut -d';' -f3 <<< $line) 
    echo "$(cut -d';' -f1-2 <<< $line); $(grep $key file1 | cut -d',' -f1);" >> file3 
done 

oder

cat file2 | while read line; do key=$(cut -d';' -f3 <<< $line); echo "$(cut -d';' -f1-2 <<< $line); $(grep $key file1 | cut -d',' -f1);"; done > file3 
0

Wenn Sie Join verwenden möchten.

join -t ';' -1 2 -2 3 -o 2.1,2.2,1.1 <(sort -t , -k 2 File\ 1 | tr ',' ';') <(sort -t ';' -k 3 File\ 2) | sort > File\ 3 
+0

Ist es möglich, diejenigen Spalten zu belassen, die nicht zu einer Datei hinzugefügt wurden? Bis jetzt, wie ich sehe, zeigt es nur die Daten, die verbunden sind. – Robbac

+0

Ja und Nein, mit Join verlieren Sie das Format der Datei. Du kannst versuchen, join -v 1 -v 2 -t ';' -1 2 -2 3 -o 2.1,2.2,1.1 <(sort -t, -k 2 Datei \ 1 | tr ',' ';') <(sort -t ';' -k 3 Datei \ 2). Es ist besser awk Lösung von RomanPerekrest zu verwenden. awk 'NR == FNR {b [$ 2] = $ 0; a [$ 2] = $ 1; nächster} $ 3 in einem {a [$ 3] = 1}! ($ 3 in a) {print} END {für (i in a) if (a [i]! = 1) drucke b [i]} 'FS =', 'Datei \ 1 FS ='; ' OFS = '; 'Datei \ 2 –

Verwandte Themen