nレコードのフィールドを増分(コピー)する

nレコードのフィールドを増分(コピー)する

次のようなファイルがあります:

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、現在のレコードを出力します。これにより、コードが簡素化されます。

コードの主なエラーVAR$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

関連情報