2017-04-18 3 views
1

Ich versuche, zwei CSV-Datei in eine einzige Datei auf folgende Weise zusammenführen. erste Datei: enthält alle Daten. zweite Datei: Daten enthalten aktualisiert.Merge zwei csv-Datei in Linux

so die resultierende Datei sollte alle Daten mit der Zeile enthalten über den zweiten Dateidaten geändert ..

Beispiel:

file1: 
1,Hello,123 
2,Hello,456 
3,Bye,789 

file2: 
1,Hello,123 
3,Hello,789 
4,Bye,345 

resulted file: 
1,Hello,123 
2,Hello,456 
3,Hello,789 
4,Bye,345 

alle neuen Eintrag hinzugefügt werden soll, sollte kein alter Eintrag entfernt werden, ist jeder aktualisierte Eintrag sollte in Ergebnis aktualisiert werden.

Ich suche nach einer einfacheren Lösung über ein Shell-Skript.

Vielen Dank im Voraus. :)

+0

Vermissen Sie Zeilenumbrüche? – kabanus

+0

fehlende Newline? bei Bedarf kann ich es in der Vorverarbeitung der Datei hinzufügen –

+0

NM, jemand bearbeitet Ihre Frage. Bitte beachten Sie, was sie getan haben - so sollte es aussehen. Auch ist jede Sprache in Ordnung oder nur bash/csh? – kabanus

Antwort

0

das erste Element in den Dateien Angenommen, der Schlüssel ist, können Sie es mit awk wie folgt tun:

Parsen.awk

BEGIN { FS = OFS = "," } 

FNR == NR { 
    h[$1] = $0 
    next 
} 

{ h[$1] = $0 } 

END { 
    for(k in h) 
    print h[k] 
} 

Run es wie folgt aus:

awk -f parse.awk file1 file2 

Oder als Einzeiler:

awk 'FNR==NR{h[$1]=$0;next} {h[$1]=$0}END{for(k in h)print h[k]}' FS=, OFS=, file1 file2 

Ausgang in beiden Fällen:

1,Hello,123 
2,Hello,456 
3,Hello,789 
4,Bye,345 
+0

Danke Thor @ das funktioniert (Y) :) –

0

Sie müssen den Begriff "Daten aktualisiert" besser definieren.

Wenn Ihre Datei 1 hat diese Zeile

3, Bye, 789

und Datei 2 hat diese Zeilen

3, hallo, 789

4 , Tschüss, 345

dann müssen Sie angeben, was als "aktualisiert" angesehen wird. Ist die erste Nummer Ihr Datenschlüssel? Ist das Wort der Schlüssel? Ist der Fall signifikant? Ist die letzte Nummer dein Schlüssel?

Dann geben Sie

kein alter Eintrag sollte

aber Ihre Ergebnisse Datei enthält nicht die Linie

3,

Bye, 789

entfernt werden

So klar erwarten Sie, dass Daten entfernt werden.

Sobald Sie Ihre Kriterien besser definiert haben, können Sie mit der Programmierung einer Lösung beginnen.

+0

erste Nummer ist mein Schlüssel. alter Eintrag sollte aktualisiert werden, wenn der Schlüssel in der zweiten Datei vorhanden ist. 3, hallo, 789 4, Bye, 345 (3 war in beide Datei sollten zweite Dateidaten gibt es in diesem Fall in Endergebnisses sein) –

+0

Dieses isn‘: für diese Dateien, Ergebnis so sein sollte t eine Antwort, Sie sollten dies zu den Kommentaren verschieben, die ich denke. – kabanus

0

Eine bash Lösung Annahme der Variablen res existiert nicht:

for f in file1 file2; do 
    while read line; do 
     res[${line%%,*}]=$line; 
    done < $f 
done 

Das Array enthält jetzt, was Sie wollen. Wenn Sie es jetzt in einer Datei möchten:

for x in ${res[*]}; do echo $x; done > resultFile 
+0

Ein Kommentar - wenn es darauf ankommt, kann die ganze Sache in einer Zeile geschrieben werden, wenn Sie es in einer Shell brauchen. – kabanus