
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
sed
Mit und ist es viel einfacher, leichter und schneller xargs
. Hier sed
wird 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 sed
können Sie beispielsweise Folgendes tun:
for f in *.csv
do
sed -i 's/$/ '"$f"'/' "$f"
done
Testen
In einem der Verzeichnisse habe ich einige csv
Dateien 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 sed
Befehl hinzufügen, bevor Sie den Dateinamen anhängen. Ändern Sie den sed
Befehl wie unten beschrieben.
sed -i 's/$/ '";$f"'/' "$f"
Verweise
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, mv
wenn Sie eine neuere Version von haben, awk
aber 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 *.csv
alle Dateien im aktuellen Verzeichnis verarbeiten. -i.bak
Mit der Option können Sie alle Dateien direkt bearbeiten und Sicherungsdateien mit dem Namen erstellen *.csv.bak
.