2017-03-06 4 views
1

Ich arbeite an Sortieren, Join und awk 2 CSV-Dateien (Semikolon Trennzeichen), die von der ersten Spalte zugeordnet sind.Merge 2 Dateien und dann verketten Spalten

File1.csv:

TL_01;labelSD1;PFL_11 
TL_01;labelSD1;PFL_12 
TL_01;labelSD1;PFL_13 
TL_02;labelSD3;PFL_04 
TL_03;labelSD4;PFL_05 

File2.csv:

TL_01;labelRT1;JV_111 
TL_02;labelRT3;JV_02 
TL_03;labelRT4;JV_03 

ich diese beiden Dateien zusammenführen möchten und verketten die mehrere Werte der dritten Spalte in File1.csv in einem Spalten mit '#' Trennzeichen nach diesem Modell:

RightMerge.csv:

TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111 
TL_02;labelSD3;PFL_04;labelRT3;JV_02 
TL_03;labelSD4;PFL_05;labelRT4;JV_03 

Eigentlich kann ich die 2 Dateien zusammenführen, aber nicht Multiples Werte mit einem bestimmten Zeichen (#) mit dem folgenden Befehl (Dateien sind bereits sortiert nach der ersten Spalte) zu verketten :

join -11 -21 File1.csv File2.csv -t ';' > FileOut.csv 

, die das folgende Ergebnis liefert:

FileOut.csv:

TL_01;labelSD1;PFL_11;labelRT1;JV_111 
TL_01;labelSD1;PFL_12;labelRT1;JV_111 
TL_01;labelSD1;PFL_13;labelRT1;JV_111 
TL_02;labelSD3;PFL_04;labelRT3;JV_02 
TL_03;labelSD4;PFL_05;labelRT4;JV_03 

Danach versuche ich awk Skript zu verwenden, um die ersten drei Zeilen wie diese verketten:

TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111 

Aber ich eine Lösung für diese nicht finden. Sollte ich mit der awk Behandlung fortfahren oder gibt es einen anderen Weg dies zu tun?

Antwort

0
$ cat tst.awk 
BEGIN { FS=OFS=";" } 
NR==FNR { key2val[$1] = ($1 in key2val ? key2val[$1] "#" $3 : $0); next } 
{ print key2val[$1], $2, $3 } 

$ awk -f tst.awk file1 file2 
TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111 
TL_02;labelSD3;PFL_04;labelRT3;JV_02 
TL_03;labelSD4;PFL_05;labelRT4;JV_03 

Es nimmt nur dann geposteten Probe Eingangsdaten Ihrer realen Daten wirklich repräsentativ ist, z.B. Jeder Schlüsselwert ist in beiden Dateien usw. vorhanden. Wenn dies nicht der Fall ist, bearbeiten Sie Ihre Frage, um einige wirklich repräsentative Beispiel-Ein-/Ausgaben anzuzeigen.

+0

Ja jeder Schlüsselwert in beiden Dateien vorhanden ist. – Blackcheap

+0

Könnten Sie ein bisschen die folgende Zeile erklären: key2val [$ 1] = ($ 1 in key2val? Key2val [$ 1] "#" $ 3: $ 0); nächste Ich bin mir nicht sicher, jeden Vorgang zu verstehen. – Blackcheap

+0

Es ist nur ein [ternärer Ausdruck] (https://en.wikipedia.org/wiki/%3F :) 'Variable = (Bedingung? Wert wenn wahr: Wert wenn falsch)'. –

0

Sie auch diese kann man versuchen,

cat FileOut.csv | 
     awk ' 
     BEGIN{ 
      FS=OFS=SUBSEP=";" 
     } 
     NF>1{ 
      a[$1,$2,$4,$5] = a[$1,$2,$4,$5]";"$3 
     } 
     END{ 
      for(i in a){ 
        split(i,arr,";"); 
        print arr[1]";"arr[2]";"a[i]";"arr[3]";"arr[4] 
        } 
     }' | 
sort 

Check it

+0

Diese Arbeit für die Verkettung aber die Reihenfolge der Spalte ist nicht richtig. Es könnte leicht modifiziert werden. Das Trennzeichen der Verkettung ist nicht definiert. – Blackcheap

+0

Überprüfen Sie noch einmal @Blackcheap .. Ich habe dieses Snippet geändert .... –