
Tengo muchos archivos CSV y necesito el nombre de cada archivo CSV específico en cada línea de cada archivo.
Contenido del archivo original de abc123.csv
:
ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6
Nuevo contenido del archivo:
ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv
Todos los archivos CSV están en el mismo directorio. No quiero especificar el nombre de cada archivo.
Respuesta1
Es mucho más simple, fácil y rápido con sed
y xargs
. Aquí sed
se utiliza la edición in situ evitando así herramientas de shell adicionales.
$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
Y aquí está el resultado.
$ 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
Respuesta2
Usando sed
puedes hacer algo como,
for f in *.csv
do
sed -i 's/$/ '"$f"'/' "$f"
done
Pruebas
Dentro de uno de los directorios, creé un par de csv
archivos.
cat csv1.csv
this
is
first
csv
file
##Second CSV file
cat csv2.csv
this
is
second
csv
file
Ahora, ejecuté el comando anterior que mencioné. Después de la ejecución del comando, los archivos se ven como se muestra a continuación.
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
Si quierespunto y comapuede simplemente agregarlo en el sed
comando antes de agregar el nombre del archivo. Cambie el sed
comando como se muestra a continuación.
sed -i 's/$/ '";$f"'/' "$f"
Referencias
Respuesta3
Qué tal si:-
for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done
Podrías evitarlo mv
si tienes una versión posterior, awk
pero probablemente sea más portátil.
Respuesta4
Con perl
:
$ perl -i.bak -ple '$_ .= ";"$ARGV' file.csv
ColVal_1;ColVal_2;ColVal_3;file.csv
ColVal_4;ColVal_5;ColVal_6;file.csv
De perldoc -v '$ARGV'
:
$ARGV Contains the name of the current file when reading from "<>".
Puede utilizarlo *.csv
para procesar todos los archivos en el directorio actual. -i.bak
opción editar todos los archivos en el lugar y crear archivos de copia de seguridad con nombre *.csv.bak
.