Substitua correspondências de caracteres específicas em todas as linhas, usando a primeira linha como referência

Substitua correspondências de caracteres específicas em todas as linhas, usando a primeira linha como referência

H, quero substituir correspondências de caracteres específicas (.) em todas as linhas, usando a primeira linha como referência

Minha tentativa de refazer o hash de uma resposta, cheguei a uma pergunta diferente:

awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[$i] } NR>1 {for(i in a) if( $i == "\." ) $i="a"}1'

...a ideia do retrabalho que tentei no código acima foi armazenar os caracteres da primeira linha em 'a', e depois ao ver um '.' em linhas>1 alterando o '.' ao caractere da coluna correspondente armazenado em 'a'. Mas não funcionou.

Entrada:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
.|C|G|A|T|T|.|.|G|C|.|.|.|A|C|R|C|.|T|T
A|.|.|.|N|.|T|T|N|.|.|A|C|.|.|R|.|.|.|.

Saída desejada:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

Responder1

Ideia certa – implementação errada

  1. você precisa armazenar o campovaloresem uma matriz indexada pelo campoposição. Então, em vez de a[$i], faça issoa[i]=$i

  2. então você precisa procurar os valorespor índicena matriz. Então não $i="a"mas$i=a[i]

Além disso, $i == "\."não é um teste de expressão regular, então você não precisa escapar.

$ awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[i]=$i } NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1' file
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

ComoEd Morton apontou, você pode melhorar a solução substituindo o loop explícito usando a função integrada do awk split:

awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'

informação relacionada