Reemplace coincidencias de caracteres específicos en todas las filas, utilizando la primera línea como referencia

Reemplace coincidencias de caracteres específicos en todas las filas, utilizando la primera línea como referencia

H, quiero reemplazar coincidencias de caracteres específicos (.) en todas las filas, usando la primera línea como referencia

En mi intento de repetir una respuesta llegué a una pregunta 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'

... la idea de la reelaboración que probé en el código anterior era almacenar los caracteres de la primera fila en 'a', y luego, al ver un '.' en filas>1 cambiando el '.' al carácter de columna correspondiente almacenado en 'a'. Pero no funcionó.

Aporte:

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|.|.|.|.

Salida deseada:

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

Respuesta1

Idea correcta - implementación incorrecta

  1. necesitas almacenar el campovaloresen una matriz indexada por el campoposición. Entonces en lugar de a[$i], haz esoa[i]=$i

  2. entonces necesitas buscar los valorespor índiceen la matriz. entonces no $i="a"pero$i=a[i]

Además, $i == "\."no es una prueba de expresión regular, por lo que no es necesario 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 señaló, puedes mejorar la solución reemplazando el bucle explícito usando la función incorporada awk split:

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

información relacionada