
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
necesitas almacenar el campovaloresen una matriz indexada por el campoposición. Entonces en lugar de
a[$i]
, haz esoa[i]=$i
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'