bash sed / awk: substitua a string de um arquivo pesquisando em outro arquivo

1

Eu tenho uma pergunta sobre pesquisa e substituição no Debian. Eu tenho dois arquivos. Um com:

a:b
c:d
e:f

e o outro com:

 e
 c
 a'

No segundo arquivo, quero substituir a por b , c por d , e por f . Como posso fazer isso?

    
por maun goldman 21.02.2015 / 20:40

2 respostas

1

$ awk -F: 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i, a[i]);print}' file1 file2
 f
 d
 b

Como funciona

  • -F:

    Isso diz awk para dividir campos nos dois pontos.

  • FNR==NR{a[$1]=$2;next}

    Ao ler o primeiro arquivo, isso diz a awk para criar um dicionário a das traduções que queremos fazer.

  • for (i in a)sub(i, a[i])

    Ao ler o segundo arquivo, isso indica ao awk para substituir todas as entradas que armazenamos em nosso dicionário a .

  • print

    Depois de termos feito as substituições, isso diz awk para imprimir a linha.

Substituindo arquivo2

Para substituir file2 pela nova versão:

awk -F: 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i, a[i]);print}' file1 file2 >tmp && mv tmp file2

Com versões muito recentes de awk , há uma opção de atalho para isso: -i inplace . Sob a superfície, porém, o que essa opção faz é exatamente o que o comando acima faz.

    
por 21.02.2015 / 21:18
1

Um pouco mais complicado:

sed -f <(sed 's!\(.*\):\(.*\)!s///!' file1) file2
  • sed 's!\(.*\):\(.*\)!s///!' file1 lê o primeiro arquivo e as saídas:

    s/a/b/
    s/c/d/
    s/e/f/
    
  • <(the_above) executa o comando acima com saída para um arquivo temporário.
  • sed -f <(…) file2 runs sed on file2 usando esse arquivo temporário como um arquivo de entrada (script).

Para enviar a saída de volta para file2 , adicione uma opção -i :

sed -i -f <(sed 's!\(.*\):\(.*\)!s///!' file1) file2
    
por 21.02.2015 / 22:17

Tags