Encontre e substitua recursivamente o conteúdo de um arquivo usando uma chave de outro arquivo

0

Eu preciso usar um arquivo como entrada para localizar e substituir em outro arquivo. O comando a seguir faz isso, mas apenas para a primeira coluna de cada linha. Preciso que isso aconteça para todas as colunas.

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{$1=a[$1];print}' OFS=',' file1 file2 > fileout

Os dois arquivos parecem com isso

arquivo1 (a chave):

0,name0
1,name1
2,name2
3,name3
4,name4

arquivo2:

23,45,0
41,1,2,4
4,5,22,100
10,20,31,51,1
33,3
16,111,3

A saída deve ser:

23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3
    
por Johnny 21.08.2018 / 22:00

3 respostas

1

Isso funcionou:

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{for (i=1;i<=NF;i++) $i=a[$i];print}' OFS=',' file1 file2 > fileout

Obrigado

    
por 21.08.2018 / 22:33
1

Eu não acho que acima funcione. Resultado no meu sistema:

,,name0
,name1,name2,name4
name4,,,
,,,,name1
,name3
,,name3

Tente

awk -F',' 'NR==FNR{a[$1]=$2; next} {for (i=1;i<=NF;i++) if (a[$i]) $i=a[$i]} 1' OFS=',' file1 file2
23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3
    
por 22.08.2018 / 01:10
1

Isso também pode ser feito com sed :

sed -f <(sed 's|,|$/,|;s|^|s/,|;s|$|/|' f1) f2

Como apontado por Kusalananda, esta solução usa a substituição de processos, que nem todos os shells comuns suportam. No entanto, existem outras maneiras de obter o mesmo efeito.

Como isso funciona? A idéia básica é transformar o arquivo f1 em um programa sed que, por sua vez, transformará o arquivo f2 . O comando sed entre parênteses transforma cada linha do arquivo f1 em um comando s/// .

    
por 22.08.2018 / 09:32