次のファイルがあります。
A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e
出力は次のようにする必要があります
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e
このスクリプトは次のとおりです。
awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}
動作しません(以下の結果):
A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e
構文や変数がどのように機能するかについて何かが欠けているようです。 awkスクリプトの解決策はありますか?
ありがとう
答え1
$ 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
letter
フィールドの先頭で大文字が検出されたら、変数を最初のフィールドの値に設定します。次に、無条件に最初のフィールドを保存データに設定し、行を印刷します。
5行ごとに最初のフィールドを選択して単純化する方法を使用します。
$ 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
どちらのバリアントでも、無条件に最初のフィールドを値に設定し、letter
現在のレコードを印刷します。これによりコードが簡素化されます。
コードの主なエラーはforVAR
に設定されていることです。$1
すべて入力ライン:
{
if ( NR%5 != 1 ) {
print VAR, $2
} else {
print $1, $2
}
VAR = $1 # <-- problem: is triggered on every line
}
答え2
次のスクリプトで完了
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
出力
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e