私はこれがAWKで最もうまくいくと思いますが、確かではありません。これをどうすべきか一日中悩んでいました。行のフィールドの間に*区切り文字を含むテキストファイルがあります。 L11 * 1Zで始まる行を検索し、1Zで始まる変数またはバッファーに値を格納する必要がありますが、次の*(つまり行の2番目のフィールド)は除外する必要があります。最初のケースでは1ZXDF430になります。次に、BGNで始まる次の行に移動して、文字列QVD(行の3番目のフィールド)を変数の値に置き換える必要があります。ファイル内のすべてのL11 * 1Zおよび次のBGN行に対してこれを行う必要があります。可能であれば、入力ファイルを上書きするよりも新しいファイルを出力することをお勧めします。
入力ファイル
xxx
L11*123456*CR
yyy
L11*1ZXDF430*2I*04
zzz
BGN*00*QVD*123456
fff
L11*768907*CR
L11*12345678*CR
xxx
L11*1ZXDF499*2I*04
zzz
BGN*00*QVD*123456
xxx
生成された出力ファイル
xxx
L11*123456*CR
yyy
L11*1ZXDF430*2I*04
zzz
BGN*00*1ZXDF430*123456
fff
L11*768907*CR
L11*12345678*CR
xxx
L11*1ZXDF499*2I*04
zzz
BGN*00*1ZXDF499*123456
xxx
答え1
BGN
それぞれの後ろに1つずつあると仮定すると、L11*1Z
次のものを使用できます。
$ awk 'BEGIN{OFS=FS="*"} /^L11\*1Z/ {x = $2} /^BGN/ {$3 = x} 1' file
xxx
L11*123456*CR
yyy
L11*1ZXDF430*2I*04
zzz
BGN*00*1ZXDF430*123456
fff
L11*768907*CR
L11*12345678*CR
xxx
L11*1ZXDF499*2I*04
zzz
BGN*00*1ZXDF499*123456
xxx