Find specific pattern and change some of block values using awk

Hi,

Could you please help me finding a way to replace a specific value in a text block when matching a key pattern ?

I got the keys and the values from a command similar to:

echo -e "key01 Nvalue01-1 Nvalue01-2 Nvalue01-3\nkey02 Nvalue02-1 Nvalue02-2 Nvalue02-3 \nkey03 Nvalue03-1 Nvalue03-2 Nvalue03-3" 
key01 Nvalue01-1 Nvalue01-2 Nvalue01-3
key02 Nvalue02-1 Nvalue02-2 Nvalue02-3 
key03 Nvalue03-1 Nvalue03-2 Nvalue03-3

The file which contains the text blocks is similar to:

cat file1 
[key00]
fieldA = value00
fieldB = value00B
fieldC = value00C
[key01]
fieldA = value01 
fieldB = value01B
fieldC = value01C
[key01-new]
fieldA = value01
fieldB = value01B
fieldC = value01C
[key02]
fieldA = value02
fieldB = value02B
fieldC = value02C
filedX = textstring
[key02-new]
fieldA = value02
fieldB = value02B
fieldC = value02C
[key-03]
fieldA = value03
fieldB = value03B
fieldC = value03C
[key03-new]
fieldA = value03
fieldB = value03B
fieldC = value03C
filedH = somevalue
[key05]
fieldA = value04
fieldB = value05B
fieldC = value05C
filedD = othervalue  
[key06]
fieldA = value06
fieldB = value06B
fieldC = value06C

I want to replace fieldA fieldB and fieldC values for the keys: key01-new key02-new and key03-new .

Desired output should be similar to:

[key00]
fieldA = value00
fieldB = value00B
fieldC = value00C
[key01]
fieldA = value01 
fieldB = value01B
fieldC = value01C
[key01-new]
fieldA = Nvalue01-1
fieldB = Nvalue01-2
fieldC = Nvalue01-3
[key02]
fieldA = value02
fieldB = value02B
fieldC = value02C
filedX = textstring
[key02-new]
fieldA = Nvalue02-1
fieldB = Nvalue02-2
fieldC = Nvalue02-3
[key-03]
fieldA = value03
fieldB = value03B
fieldC = value03C
[key03-new]
fieldA = Nvalue03-1
fieldB = Nvalue03-2
fieldC = Nvalue03-3
filedH = somevalue
[key05]
fieldA = value04
fieldB = value05B
fieldC = value05C
filedD = othervalue  
[key06]
fieldA = value06
fieldB = value06B
fieldC = value06C

Below is what I have tried so far, but as you can see is not working very well.
Key matching works, and presume in order to have a single iteration, I need to read keys and values into an array, and I'm afraid this is beyond my capabilities.

echo -e "key01 Nvalue01-1 Nvalue01-2 Nvalue01-3\nkey02 Nvalue02-1 Nvalue02-2 Nvalue02-3 \nkey03 Nvalue03-1 Nvalue03-2 Nvalue03-3"  | while read k1 v1 v2 v3 ; do awk -v key=$k1 -v vl1=$v1 -v vl2=$v2 -v vl3=$v3  '/\[.*\]/ {if ($0 ~ key"-new") replace=1; else replace=0;} {if (replace && $1 == "fieldA" ) $3=vl1 ; else if (replace && $1 == "fieldB" ) $3=vl2 ; else if (replace && $1 == "fieldC" ) $3=vl3 ;}1' file1 ; done
[key00]
fieldA = value00
fieldB = value00B
fieldC = value00C
[key01]
fieldA = value01 
fieldB = value01B
fieldC = value01C
[key01-new]
fieldA = Nvalue01-1
fieldB = Nvalue01-2
fieldC = Nvalue01-3
[key02]
fieldA = value02
fieldB = value02B
fieldC = value02C
filedX = textstring
[key02-new]
fieldA = value02
fieldB = value02B
fieldC = value02C
[key-03]
fieldA = value03
fieldB = value03B
fieldC = value03C
[key03-new]
fieldA = value03
fieldB = value03B
fieldC = value03C
filedH = somevalue
[key05]
fieldA = value04
fieldB = value05B
fieldC = value05C
filedD = othervalue  
[key06]
fieldA = value06
fieldB = value06B
fieldC = value06C

[key00]
fieldA = value00
fieldB = value00B
fieldC = value00C
[key01]
fieldA = value01 
fieldB = value01B
fieldC = value01C
[key01-new]
fieldA = value01
fieldB = value01B
fieldC = value01C
[key02]
fieldA = value02
fieldB = value02B
fieldC = value02C
filedX = textstring
[key02-new]
fieldA = Nvalue02-1
fieldB = Nvalue02-2
fieldC = Nvalue02-3
[key-03]
fieldA = value03
fieldB = value03B
fieldC = value03C
[key03-new]
fieldA = value03
fieldB = value03B
fieldC = value03C
filedH = somevalue
[key05]
fieldA = value04
fieldB = value05B
fieldC = value05C
filedD = othervalue  
[key06]
fieldA = value06
fieldB = value06B
fieldC = value06C

[key00]
fieldA = value00
fieldB = value00B
fieldC = value00C
[key01]
fieldA = value01 
fieldB = value01B
fieldC = value01C
[key01-new]
fieldA = value01
fieldB = value01B
fieldC = value01C
[key02]
fieldA = value02
fieldB = value02B
fieldC = value02C
filedX = textstring
[key02-new]
fieldA = value02
fieldB = value02B
fieldC = value02C
[key-03]
fieldA = value03
fieldB = value03B
fieldC = value03C
[key03-new]
fieldA = Nvalue03-1
fieldB = Nvalue03-2
fieldC = Nvalue03-3
filedH = somevalue
[key05]
fieldA = value04
fieldB = value05B
fieldC = value05C
filedD = othervalue  
[key06]
fieldA = value06
fieldB = value06B
fieldC = value06C

Thanks is advance.

a but convoluted and could be improved, but it's a start.
awk -f alex.awk file1 file2 where file1 is your 'command output', file2 is the other file and alex.awk is:

BEGIN{ new="-new"}
FNR==NR {
  f1=$1 "-new"
  kA[f1]
  for(i=2;i<=NF;i++)
   kvA[f1,i]=$i
   next;
}

/^[[]/ {
   k=substr($0,2,index($0,"]")-2)
   if(k in kA) {
     found=1
     kvI=0
   }
   else
     found=kvI=0
}
found && kvI++{$NF=((k,kvI) in kvA)?kvA[k,kvI]:$NF}
1

Or if you want to integrate it with the output of a comand without a temp file:
myCommand | awk -f alex.awk - file2

1 Like

Thank you very much for your help, works like a charm.