より明確にするために質問を編集しました。
次のファイルがあります。
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
答え2
1つの方法は次のとおりです。
$ awk '/^Block/{block=$1}
/foo/{
printf "The value of foo in %s is : %s\n",block,$2
}' file
The value of foo in Block1 is : 5423
The value of foo in Block2 is : 6435907
The value of foo in Block3 is : 353321111
The value of foo in Block4 is : 9876543210
あるいは、複数行から始めることができ、Block
すぐに次の行だけを希望する場合は、次のものをBEGIN
使用できます。
awk '/BEGIN/{a=1}
/END/{a=0}
/^Block/ && a{
block=$1;
a=0
}
/foo/{
printf "The value of foo in %s is : %s\n",block,$2
}' file