
Tenho muitos arquivos CSV e preciso do nome de cada arquivo CSV específico em cada linha de cada arquivo.
Conteúdo do arquivo original de abc123.csv
:
ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6
Novo conteúdo do arquivo:
ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv
Todos os arquivos CSV estão no mesmo diretório. Não quero especificar o nome de cada arquivo.
Responder1
É muito mais simples, fácil e rápido com sed
e xargs
. Aqui sed
usa edição no local, evitando ferramentas adicionais de shell.
$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
E aqui está a saída.
$ 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
Responder2
Usando sed
você pode fazer algo como,
for f in *.csv
do
sed -i 's/$/ '"$f"'/' "$f"
done
Teste
Dentro de um dos diretórios, criei alguns csv
arquivos.
cat csv1.csv
this
is
first
csv
file
##Second CSV file
cat csv2.csv
this
is
second
csv
file
Agora, executei o comando acima que mencionei. Após a execução do comando, os arquivos ficam como abaixo.
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
Se você quiserponto e vírgulavocê pode simplesmente adicioná-lo no sed
comando antes de anexar o nome do arquivo. Altere o sed
comando como abaixo.
sed -i 's/$/ '";$f"'/' "$f"
Referências
Responder3
Que tal:-
for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done
Você poderia evitar mv
se tiver uma versão posterior, awk
mas provavelmente é mais portátil.
Responder4
Com 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 "<>".
Você pode usar *.csv
para processar todos os arquivos no diretório atual. -i.bak
opção editar todos os arquivos no local e criar arquivos de backup com o nome *.csv.bak
.