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
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
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
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
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///
.
Tags text-processing awk replace