テキストファイル:文字列の検索、文字列フィールドをvarに保存、2番目の文字列を検索、フィールドをvarに置き換え、最後まで繰り返し

テキストファイル:文字列の検索、文字列フィールドをvarに保存、2番目の文字列を検索、フィールドをvarに置き換え、最後まで繰り返し

私はこれが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

関連情報