pt - Use o arquivo1 para localizar as substituições contidas no arquivo2 para as linhas do arquivo3 [duplicado]

2

Sou novo aqui e não postei muito, vou tentar deixar isso o mais claro possível.

Eu quero realizar um find e replace que envolve três arquivos: find.csv identifica linhas contendo strings. Eu quero substituir a linha inteira com uma linha de replace.csv. O terceiro arquivo é o mainfile.csv, que contém cerca de 1000 linhas.

Isso é o que eu tenho até agora, mas estou recebendo uma mensagem de erro:

sed "s/$(cat find.csv)/$(cat replace.csv)/" mainfile.csv > out.csv
sed: 1: "s/CHL_13_R4 
DCK_09_R4  ...": unterminated substitute pattern

Aqui está o conteúdo dos arquivos:

find.csv
CHL_13_R4 
DCK_09_R4 
DCK_10_R4 
DCK_11_R4 
DCK_13_R4 

replace.csv
CHL_13_R12,CHL_13,R12,10/14/2014
DCK_09_R12,DCK_09,R12,10/14/2014
DCK_10_R32,DCK_10,R32,10/14/2014
DCK_11_R21,DCK_11,R21,10/14/2014

O mainfile contém entradas como em replace.csv, mas cerca de 30 precisam ser atualizadas. Então, tomando a primeira linha como um exemplo. A linha em mainfile.csv que tem 'CHL_13_R4' precisa ser substituída por CHL_13_R12, CHL_13, R12,10 / 14/2014

Obrigado pela ajuda!

    
por GigaZaur 04.05.2016 / 01:11

1 resposta

0

Primeiro, crie um script sed a partir desses dois arquivos:

paste -d$'\t' find.csv replace.csv | 
    sed -e 's:/:\/:g; s:\t:/:; s:^:s/:; s:$:/g;:' > myscript.sed

Isso substituirá todas as ocorrências de strings em find.csv pelas strings em replace.csv . Ele falhará se alguma das linhas em find.csv contiver um caractere de tabulação, já que isso está sendo usado por paste como o separador entre as linhas unidas.

A saída é assim:

s/CHL_13_R4/CHL_13_R12,CHL_13,R12,10\/14\/2014/g;
s/DCK_09_R4/DCK_09_R12,DCK_09,R12,10\/14\/2014/g;
s/DCK_10_R4/DCK_10_R32,DCK_10,R32,10\/14\/2014/g;
s/DCK_11_R4/DCK_11_R21,DCK_11,R21,10\/14\/2014/g;
s/DCK_13_R4//g;

(observe que a última linha não tem uma substituição. Isso porque seu find.csv tinha 5 linhas, enquanto seu replace.csv tinha apenas 4 linhas)

Se você quiser substituir toda a linha contendo strings de find.csv :

paste -d$'\t' find.csv replace.csv | 
    awk -F$'\t' '{gsub(/\//,"\/"); print "/"$1"/ s/^.*/"$2"/;"}' > myscript.sed

A saída desta versão é assim:

/CHL_13_R4/ s/^.*/CHL_13_R12,CHL_13,R12,10\/14\/2014/;
/DCK_09_R4/ s/^.*/DCK_09_R12,DCK_09,R12,10\/14\/2014/;
/DCK_10_R4/ s/^.*/DCK_10_R32,DCK_10,R32,10\/14\/2014/;
/DCK_11_R4/ s/^.*/DCK_11_R21,DCK_11,R21,10\/14\/2014/;
/DCK_13_R4/ s/^.*//;

De qualquer forma, qualquer que seja a versão que funcione melhor para você, depois de gerar o script myscript.sed , execute-o no seu mainfile.csv :

sed -f myscript.sed mainfile.csv

(opcionalmente use -i se você quiser fazer uma edição 'in-place' em mainfile.csv )

NOTA: é possível fazer isso sem usar um arquivo temporário como myscript.sed para manter o script. A maioria das versões do sed pode executar scripts do stdin. Mas dessa forma, você pode examinar e / ou editar o script sed gerado antes de executá-lo no seu arquivo principal.

    
por 04.05.2016 / 02:37

Tags