Concatenar el nombre del archivo dentro del archivo CSV para cada línea para múltiples archivos CSV

Concatenar el nombre del archivo dentro del archivo CSV para cada línea para múltiples archivos CSV

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 sedy xargs. Aquí sedse 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 sedpuedes 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 csvarchivos.

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 sedcomando antes de agregar el nombre del archivo. Cambie el sedcomando como se muestra a continuación.

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

Referencias

http://www.unix.com/unix-for-dummies-questions-and-answers/150545-merge-files-add-file-name-end-each-line.html

Respuesta3

Qué tal si:-

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

Podrías evitarlo mvsi tienes una versión posterior, awkpero 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 *.csvpara procesar todos los archivos en el directorio actual. -i.bakopción editar todos los archivos en el lugar y crear archivos de copia de seguridad con nombre *.csv.bak.

información relacionada