Verketten Sie den Dateinamen innerhalb der CSV-Datei für jede Zeile mehrerer CSV-Dateien.

Verketten Sie den Dateinamen innerhalb der CSV-Datei für jede Zeile mehrerer CSV-Dateien.

Ich habe viele CSV-Dateien und brauche den Dateinamen jeder einzelnen CSV-Datei in jeder Zeile jeder Datei.

Originaldateiinhalt von abc123.csv:

ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6

Neuer Dateiinhalt:

ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv

Alle CSV-Dateien liegen im selben Verzeichnis. Ich möchte den Namen jeder einzelnen Datei nicht angeben.

Antwort1

sedMit und ist es viel einfacher, leichter und schneller xargs. Hier sedwird die Bearbeitung direkt verwendet, sodass zusätzliche Shell-Tools vermieden werden.

$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %

Und hier ist die Ausgabe.

$ cat file{1..5}.txt
ColVal_1;ColVal_2;ColVal_3;file1.txt
ColVal_4;ColVal_5;ColVal_6;file1.txt
ColVal_1;ColVal_2;ColVal_3;file2.txt
ColVal_4;ColVal_5;ColVal_6;file2.txt
ColVal_1;ColVal_2;ColVal_3;file3.txt
ColVal_4;ColVal_5;ColVal_6;file3.txt
ColVal_1;ColVal_2;ColVal_3;file4.txt
ColVal_4;ColVal_5;ColVal_6;file4.txt
ColVal_1;ColVal_2;ColVal_3;file5.txt
ColVal_4;ColVal_5;ColVal_6;file5.txt

Antwort2

Mit sedkönnen Sie beispielsweise Folgendes tun:

for f in *.csv
do
 sed -i 's/$/ '"$f"'/' "$f"
done

Testen

In einem der Verzeichnisse habe ich einige csvDateien erstellt.

cat csv1.csv

this
is
first
csv
file

##Second CSV file

cat csv2.csv

this
is
second
csv
file

Jetzt habe ich den oben genannten Befehl ausgeführt. Nach der Ausführung des Befehls sehen die Dateien wie folgt aus.

cat csv1.csv

this csv1.csv
is csv1.csv
first csv1.csv
csv csv1.csv
file csv1.csv

##Second CSV file

cat csv2.csv

this csv2.csv
is csv2.csv
second csv2.csv
csv csv2.csv
file csv2.csv

Falls Sie es wollenSemikolonsSie können es einfach dem sedBefehl hinzufügen, bevor Sie den Dateinamen anhängen. Ändern Sie den sedBefehl wie unten beschrieben.

 sed -i 's/$/ '";$f"'/' "$f"

Verweise

http://www.unix.com/unix-für-dummies-fragen-und-antworten/150545-merge-files-add-file-name-end-each-line.html

Antwort3

Wie wäre es mit:-

for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done

Sie könnten dies vermeiden, mvwenn Sie eine neuere Version von haben, awkaber dies ist wahrscheinlich portabler.

Antwort4

Mit perl:

$ perl -i.bak -ple '$_ .= ";"$ARGV' file.csv 
ColVal_1;ColVal_2;ColVal_3;file.csv
ColVal_4;ColVal_5;ColVal_6;file.csv

Aus perldoc -v '$ARGV':

$ARGV   Contains the name of the current file when reading from "<>".

Sie können *.csvalle Dateien im aktuellen Verzeichnis verarbeiten. -i.bakMit der Option können Sie alle Dateien direkt bearbeiten und Sicherungsdateien mit dem Namen erstellen *.csv.bak.

verwandte Informationen