Tengo un archivo que se parece a este:
A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e
y la salida debería verse así
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
Este guión:
awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}
no funciona (resultado a continuación):
A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e
Parece que me falta algo sobre la sintaxis o la forma en que funcionan las variables. ¿Existe una solución en las secuencias de comandos awk?
Gracias
Respuesta1
$ awk '$1 ~ /^[[:upper:]]/ { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
Esto simplemente establece la variable letter
en el valor del primer campo si detecta un carácter en mayúscula al inicio del campo. Luego, incondicionalmente, establece el primer campo con los datos guardados e imprime la línea.
Usando su enfoque de seleccionar el primer campo cada cinco líneas, con una simplificación:
$ awk 'FNR % 5 == 1 { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
En ambas variaciones configuro incondicionalmente el primer campo con el valor de letter
e imprimo el registro actual. Esto simplifica el código.
El principal error en su código es que se establece VAR
en $1
forcadalínea de entrada:
{
if ( NR%5 != 1 ) {
print VAR, $2
} else {
print $1, $2
}
VAR = $1 # <-- problem: is triggered on every line
}
Respuesta2
Hecho por el siguiente script
step1: z=`awk 'END{print NR}' filename`
step2: for ((i=1;i<=$z;i++)); do j=$(($i+4)); u=`awk -v i="$i" 'NR==i{print $1}' o.txt`;sed -n ''$i','$j'p' filename| awk -v u="$u" '{$1=u;print $0}'; i=$j; done
producción
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e