Incrementar (copiar) um campo para n registro

Incrementar (copiar) um campo para n registro

Eu tenho um arquivo que se parece com isso:

A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e

e a saída deve ser semelhante

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

Este roteiro:

awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}

não funciona (resultado abaixo):

A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e

Parece que estou faltando alguma coisa sobre a sintaxe ou a maneira como as variáveis ​​funcionam. Existe uma solução em scripts awk?

Obrigado

Responder1

$ 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

Isso simplesmente define a variável lettercom o valor do primeiro campo se detectar um caractere maiúsculo no início do campo. Em seguida, incondicionalmente, define o primeiro campo para os dados salvos e imprime a linha.

Usando sua abordagem de pegar o primeiro campo a cada cinco linhas, com uma simplificação:

$ 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

Em ambas as variações, defino incondicionalmente o primeiro campo com o valor de lettere imprimo o registro atual. Isso simplifica o código.

O principal erro no seu código é que ele VARdefine $1paratodolinha de entrada:

{
    if ( NR%5 != 1 ) {
        print VAR, $2
    } else {
        print $1, $2
    }
    VAR = $1  # <-- problem: is triggered on every line
}

Responder2

Feito pelo script abaixo

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

saída

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

informação relacionada