ファイルをチャンクに解析し、各チャンクを繰り返します。

ファイルをチャンクに解析し、各チャンクを繰り返します。

より明確にするために質問を編集しました。
次のファイルがあります。

BEGIN  
Block name : Block1
Var names : var1 var2 var3  
var1 32.7
var2 12.2
var3 65.4
END  
BEGIN 
Block name : Block43
Var names : bar55 foo3  
bar55 654.555
foo3 23.4
END 
BEGIN 
Block name : Block66
Var names : bar2  
bar2 33.0987
END 

最終出力は次のようになります。

Block1 has a var named var1 and its value is 32.7 
Block1 has a var named var2 and its value is 12.2
Block1 has a var named var3 and its value is 65.4
Block43 has a var named bar55 and its value is 654.555
Block43 has a var named foo3 and its value is 23.4
Block66 has a var named var1 and its value is 33.0987   

ブロックのサイズや変数の数がわかりません。
各ブロックがBEGIN行とEND行で囲まれていることがわかります。

ファイルを別々のチャンクに解析してそれを繰り返す方法はありますか?
内容は次のとおりです。

for block in file; do
    block_name=$(echo $block | grep 'Block' | cut -d ":" -f2)
    vars=$(echo $block | grep 'Var' | cut -d ":" -f2)
   
    for var in $vars;do
       var_value=$(echo $block | grep '^$var')
       echo "$block_name has a var named $var and its value is $var_value"
    done
  
done  

私の質問に対する最も近い答えは、sedまたはawkを使用してブロックの最初のインスタンスを取得してから終了することです。
BEGINとENDで囲まれた各ブロックから情報を取得したいです。

ご協力ありがとうございます。

ベストアンサー1

$ cat tst.awk
/^Block name/ { name = $NF }
/END/ {
    for (var in var2val) {
        printf "%s has a var named %s and its value is %s\n", name, var, var2val[var]
    }
    delete var2val
}
NF==2 { var2val[$1] = $2 }

$ awk -f tst.awk file
Block1 has a var named var1 and its value is 32.7
Block1 has a var named var2 and its value is 12.2
Block1 has a var named var3 and its value is 65.4
Block43 has a var named foo3 and its value is 23.4
Block43 has a var named bar55 and its value is 654.555
Block66 has a var named bar2 and its value is 33.0987

おすすめ記事