Erhöhen (kopieren) Sie ein Feld um n Datensätze

Erhöhen (kopieren) Sie ein Feld um n Datensätze

Ich habe eine Datei, die so aussieht:

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

und die Ausgabe sollte so aussehen

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

Dieses Skript:

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

funktioniert nicht (Ergebnis unten):

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

Anscheinend übersehe ich etwas zur Syntax oder zur Funktionsweise von Variablen. Gibt es eine Lösung in AWK-Skripten?

Danke

Antwort1

$ 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

Dies setzt die Variable einfach letterauf den Wert des ersten Felds, wenn es am Anfang des Felds einen Großbuchstaben erkennt. Dann setzt es das erste Feld bedingungslos auf die gespeicherten Daten und druckt die Zeile.

Verwenden Sie Ihren Ansatz, alle fünf Zeilen das erste Feld auszuwählen, mit einer Vereinfachung:

$ 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

In beiden Varianten setze ich das erste Feld unbedingt auf den Wert von letterund drucke den aktuellen Datensatz aus. Dies vereinfacht den Code.

Der Hauptfehler in Ihrem Code besteht darin, dass er VARauf setzt $1fürjedenEingabezeile:

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

Antwort2

Erledigt durch das folgende Skript

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

Ausgabe

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

verwandte Informationen