Incrementar (copiar) un campo para n registros

Incrementar (copiar) un campo para n registros

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 letteren 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 lettere imprimo el registro actual. Esto simplifica el código.

El principal error en su código es que se establece VARen $1forcadalí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

información relacionada