Concatenate filename dentro do arquivo CSV para cada linha de vários arquivos CSV

6

Eu tenho muitos arquivos CSV e preciso do nome do arquivo de cada arquivo CSV específico em cada linha de cada arquivo.

Conteúdo original do arquivo de abc123.csv :

ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6

Novo conteúdo de 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. Eu não quero especificar o nome de cada arquivo.

    
por AvS 25.06.2014 / 16:20

4 respostas

4

É muito mais simples, mais fácil e mais rápido com sed e xargs . Aqui sed usa edição no local evitando assim ferramentas adicionais do 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
    
por 22.11.2014 / 04:21
2

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 arquivos csv .

cat csv1.csv

this
is
first
csv
file

##Second CSV file

cat csv2.csv

this
is
second
csv
file

Agora, executei o comando acima mencionado. Após a execução do comando, os arquivos são exibidos 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ê quiser ponto-e-vírgula , basta adicioná-lo no comando sed antes de anexar o nome do arquivo. Altere o comando sed , como abaixo.

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

Referências

link

    
por 25.06.2014 / 18:56
0

Que tal: -

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

Você pode evitar o mv se tiver uma versão posterior de awk , mas isso provavelmente será mais portátil.

    
por 25.06.2014 / 16:50
0

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 option edita todos os arquivos no local e cria arquivos de backup com o nome *.csv.bak .

    
por 25.06.2014 / 16:59