replace string em um loop

0

Eu preciso de algumas strings em um arquivo da seguinte maneira

Arquivo antigo:

Real/Test1
Real/Test1
Real/Test2
Real/Test3
Real/Test3
Real/Test4

Novo arquivo:

Real/Test1  a1 b1 c1 d1
Real/Test1  a1 b1 c1 d1
Real/Test2  a2 b2 c2 d2
Real/Test3  a3 b3 c3 d3
Real/Test3  a3 b3 c3 d3
Real/Test4  a4 b4 c4 d4

Eu tenho um arquivo intermediário que tem a string antiga na coluna 1 e, em seguida, a nova string, algo assim.

Test1 a1 b1 c1 d1
Test2 a2 b2 c2 d2
Test3 a3 b3 c3 d3
Test4 a4 b4 c4 d4

Alguém poderia me ajudar com isso?

Com meu conhecimento muito primitivo, tentei seguir:

(enquanto ler n1 n2 definir n1 n2 sed -i "s / $ n1 / $ n1 $ n2 / g" antigo > final feito)

onde entradas "antigas" e "intermediárias" são o conteúdo mencionado acima.

Muito obrigado!

    
por ashu 09.05.2017 / 23:21

3 respostas

0
perl -lne '
   @ARGV and $h{$1}=s/(\S+)//r,next;
   s|/(\S+)\K|$h{$1}|;print;
' intermediate.file old.file

Resultados

Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

Explicação

  • Usando o arquivo intermediário (@ARGV é > 0), preenchemos o hash usando o primeiro campo como a chave e os campos restantes como o valor correspondente.
  • Quando processamos o arquivo antigo (@ARGV = 0), observamos a sequência após a barra e a usamos para ajustar o valor de hash e colocá-lo de volta na linha atual.
por 10.05.2017 / 09:13
2

Como seus arquivos parecem estar classificados na ordem do campo de associação, você pode usar o comando join com bastante facilidade, por exemplo,

join old <(sed 's;^;Real/;' intermediate)

ou (se o seu shell não suportar a substituição do processo)

sed 's;^;Real/;' intermediate | join old -

ex.

$ sed 's;^;Real/;' intermediate | join old -
Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4
    
por 10.05.2017 / 01:11
1

Tente algo assim com o seu gnu awk:

awk -F"[/ ]" 'NR==FNR {a[$1]=$2OFS$3OFS$4;next}$2 in a {print $0,a[$2]}'  intermediatefile oldfile >newfile
    
por 10.05.2017 / 00:28

Tags