파일을 청크로 구문 분석하고 각 청크를 반복합니다.

파일을 청크로 구문 분석하고 각 청크를 반복합니다.

더 명확하게 하기 위해 질문을 편집했습니다.
다음과 같은 파일이 있습니다.

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 

관련 정보