Concatenate lines with unique string AND number

In Bash using AWK or sed I need to convert the following file:

...
numitem_tab0[] =<p>1 KEYWORD</p><p>2 KEYWORD</p><p>3 KEYWORD</p><p>4 KEYWORD</p><p>5 KEYWORD</p>...<p>25 KEYWORD</p>
subitem_tab0[] =<p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
...
numitem_tab6[] =<p>1 KEYWORD</p><p>2 KEYWORD</p><p>3 KEYWORD</p><p>4 KEYWORD</p>
numitem_tab7[] =<p>100 KEYWORD</p><p>101 KEYWORD</p><p>102 KEYWORD</p>...<p>115 KEYWORD</p>
...
subitem_tab66[] =<p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
subitem_tab67[] =<p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab0[] =
<reference>yyyyy</reference>
</record>
...
<record><title>user name: xxxxx</title>
sub_items: subitem_tab0[] =
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab7[] =
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab6[] =
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
sub_items: subitem_tab66[] =
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
sub_items: subitem_tab67[] =
<reference>yyyyy</reference>
</record>
...

into:

...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab0[] =numitem_tab0[] =<p>1 KEYWORD</p><p>2 KEYWORD</p><p>3 KEYWORD</p><p>4 KEYWORD</p><p>5 KEYWORD</p>...<p>25 KEYWORD</p>
<reference>yyyyy</reference>
</record>
...
<record><title>user name: xxxxx</title>
sub_items: subitem_tab0[] =subitem_tab0[] =<p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab7[] =numitem_tab7[] =<p>100 KEYWORD</p><p>101 KEYWORD</p><p>102 KEYWORD</p>...<p>115 KEYWORD</p>
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
num_items: numitem_tab6[] =numitem_tab6[] =<p>1 KEYWORD</p><p>2 KEYWORD</p><p>3 KEYWORD</p><p>4 KEYWORD</p>
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
sub_items: subitem_tab66[] =subitem_tab66[] =<p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
<reference>yyyyy</reference>
</record>
...
<record>
<title>user name: xxxxx</title>
sub_items: subitem_tab67[] =subitem_tab67[] =<p>[ KEYWORD</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p><p>[ KEYWORD ]</p>
<reference>yyyyy</reference>
</record>
...

That is, every "numitem_tab*[] =..." line must be cut and concatenated with corresponding "num_items: numitem_tab*[] =" line below. The tab number in "numitem_tab*" must match.

Similarly, every "subitem_tab*[] =..." line must be cut and concatenated with the corresponding "sub_items: subitem_tab*[] =" line below.

If there is no match for a "numitem_tab*[] =..." line or a "subitem_tab*[] =..." line it must be left untouched.

There will be a maximum of 600 "numitem_tab*[] =..." + "subitem_tab*[] =..." lines per file.

something to start with - assuming 'numitem_tabN[]' and 'subitem_tabN[]' all precede the <record> definitions):

nawk -F'[=:]' '$1~/^(sub|num)item_tab[0-9][0-9]*[[]] */ {item[" "$1]=$2;next} $1~/^(sub|num)_items/{print $0, ($2 in item)?$2"="item[$2]:"";next}1' myFile
1 Like

Just what I wanted. Thank You! :slight_smile: