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 letter
auf 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 letter
und drucke den aktuellen Datensatz aus. Dies vereinfacht den Code.
Der Hauptfehler in Ihrem Code besteht darin, dass er VAR
auf setzt $1
fü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