Ich muss mehrere CSV-Dateien zusammenführen (mithilfe des cat
Befehls), ohne jedoch den Header für jede Datei zu kopieren.
Was ist der beste Weg, um diese Aufgabe zu erfüllen?
Sie benötigen mehr als den hiercat
beschriebenen Befehl :
Angenommen , Sie haben drei CSV-Dateien: file1.csv
, file2.csv
, und file3.csv
und wollen , dass sie beitreten bigfile.csv
und Ihre Header ist immer (nur) die erste Zeile, dann Gebrauch
entweder (Kopfzeile der ersten Datei "file1.csv" beibehalten):
cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
oder (Kopfzeile aus allen Dateien entfernen, deren Namen mit "file" beginnen):
awk 'FNR > 1' file*.csv > bigfile.csv
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
tail -n+2
,tail +2
würde nicht funktionierenIch bin mit der Top-Antwort einverstanden, schlage aber vor, sie mit dem folgenden Szenario zu erweitern (da ich keine Kommentare abgeben kann):
Wenn die Ausgabedatei (einmal) Header enthalten soll, lautet das richtige Skript:
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR repräsentiert die Nummer des verarbeiteten Datensatzes in einer einzelnen Datei. Und NR repräsentiert es global, so dass die erste Zeile akzeptiert wird und der Rest wie zuvor ignoriert wird.
quelle
Sie können auch einen Gruppenbefehl (
{ ; }
) anstelle der Prozessersetzung (<()
) verwenden:Es funktioniert auch mit CRLF-Zeilenenden, solange die Dateien mit einer leeren Zeile enden (
\r\n
).Die Nur-Zahlen-Versionen von head und tail wurden durch POSIX 1003.1-2001 überholt und führen in einigen Umgebungen zu Warnungen.
quelle
Wird benötigt, um zwei große CSVs mit identischen Spalten zu einer größeren CSV für Chunking-Skripts zu verknüpfen (Daten haben keine eindeutigen IDs).
Zuerst wurde der Kopfball aus dem zweiten csv entfernt
Als nächstes verkettet über die folgenden
quelle
Die Verwendung der obigen Befehlssequenz ergab eine Datei, die wie folgt aussah:
Um eine korrekte CSV-Datei mit einer Kopfzeile und allen relevanten Werten zu erstellen, habe ich die folgende
sed
Beschwörung angewendet ...sed -ie "/^$/d;/^==>/d" bigfile.csv
quelle
Einfachere Lösung, wenn Sie eine Menge Dateien haben:
Gehen Sie einfach zurück, um die große Datei zu bearbeiten, und fügen Sie den Header wieder hinzu.
quelle
awk 'FNR > 1' file*.csv > bigfile.csv
? Es ist nicht!file