더 명확하게 하기 위해 질문을 편집했습니다.
다음과 같은 파일이 있습니다.
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
한 가지 방법은 다음과 같습니다.
$ 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