Format Data - awk ..

 
/clusters/cluster-1/exports/storage-views/M1_CRE03_SV:
Name                      Value
------------------------  ---------------------------------------------------------------------------------------------------
caw-enabled               true
controller-tag            -
initiators                [AM112_A, AM112_B, KEC12_C, ABL12_D, BL13_A,
                          BL13_B, ZBL13_C, ZBL13_D, BL14_A, ZBL14_B,
                          ZBL14_C, BL14_D]
operational-status        ok
 
/clusters/cluster-1/exports/storage-views/M1P5_T2_SV:
Name                      Value
------------------------  -----------------------------------------------------------------------------------------
caw-enabled               true
controller-tag            -
initiators                [G105_A, CIG105_B, CIG105_C, CIG105_D]
operational-status        ok
 
 
 Output Needed
 M1_CRE03_SV,AM112_A;AM112_B;KEC12_C;ABL12_D;BL13_A;BL13_B;ZBL13_C;ZBL13_D;BL14_A;ZBL14_B;ZBL14_C;BL14_D
 M1P5_T2_SV,G105_A;CIG105_B;CIG105_C;CIG105_D
 

I tried this ... but not getting the required output ...

 
 gawk 'BEGIN{ RS="\n" }
/storage-views\// { gsub( /\//," ",$0);view=$NF ;DD=""}
/^initiators/,/^operational-status/ { DD=DD"|"$1
print "%s\n",view","DD
}' input
 

Hello greycells,

Following may help you same, could you please try it and let me know if this helps you.

awk '/^\/clusters\/*/{if(A){print A;A=""};gsub(/.*\/|\:/,X,$0);A=$0} /^initiators/{sub(/\[/,X,$2);gsub(/\, /,";",$0);A=A "," $0;while($0 !~ /operational-status/){sub(/^[[:space:]]+/,X,$0);gsub(/\]|\,$/,X,$0);gsub(/\,[[:space:]]+/,";",$0);A=A ";" $0;getline}} END{print A}' Input_file

Output will be as follows.

M1_CRE03_SV,initiators AM112_A;AM112_B;KEC12_C;ABL12_D;BL13_A,;initiators AM112_A;AM112_B;KEC12_C;ABL12_D;BL13_A;BL13_B;ZBL13_C;ZBL13_D;BL14_A;ZBL14_B;ZBL14_C;BL14_D
M1P5_T2_SV,initiators G105_A;CIG105_B;CIG105_C;CIG105_D];initiators G105_A;CIG105_B;CIG105_C;CIG105_D
 

EDIT: Adding a non-one liner form of solution.

awk '/^\/clusters\/*/{
                        if(A){
                                print A;
                                A=""
                             };
                        gsub(/.*\/|\:/,X,$0);
                        A=$0}
    /^initiators/    {
                        sub(/\[/,X,$2);
                        gsub(/\,[[:space:]]+/,";",$0);
                        A=A "," $0;
                        while($0 !~ /operational-status/){
                                                                sub(/^[[:space:]]+/,X,$0);
                                                                gsub(/\]|\,$/,X,$0);
                                                                gsub(/\,[[:space:]]+/,";",$0);
                                                                A=A ";" $0;
                                                                getline
                                                         }
                     }
    END{print A}
    '   Input_file
 

Thanks,
R. Singh

1 Like

getting this ...

 
 M1_CRE03_SV AM112_A, initiators AM112_A, AM112_B, KEC12_C, ABL12_D, BL13_A, BL13_B, ZBL13_C, ZBL13_D, BL14_A, ZBL14_B, ZBL14_C, BL14_D
 M1P5_T2_SV G105_A, initiators G105_A, CIG105_B, CIG105_C, CIG105_D
 

Another approach:-

gawk -F'[][,/:]' '
        /storage-views/ {
                name = $(NF-1)
                next
        }
        /^initiators/ {
                flag = 1
        }
        flag && ( !/^initiators/ && !/^ / ) {
                flag = 0
                print name "," value
                value = ""
        }
        flag {
                for ( i = 1; i <= NF; i++ )
                {
                        gsub(/ /,X,$i)
                        if ( $i !~ /initiators/ && $i )
                                value = value ? value OFS $i : $i
                }
        }
' OFS=\; file
1 Like

Or

awk '
/:$/            {sub (/:/, ",")
                 n = split ($0, T, "/")
                 printf "%s", T[n]
                }
/^initia/       {while (!/]$/)  {getline X
                                 $0 = $0 X
                                }
                 sub ("^" $1, "")
                 gsub (/[][ ]*/, "")
                 gsub (/,/, ";")
                 print
                }
' file
M1_CRE03_SV,AM112_A;AM112_B;KEC12_C;ABL12_D;BL13_A;BL13_B;ZBL13_C;ZBL13_D;BL14_A;ZBL14_B;ZBL14_C;BL14_D
M1P5_T2_SV,G105_A;CIG105_B;CIG105_C;CIG105_D
1 Like

Or:

awk -F '[][:]' '{gsub(/,[[:space:]]*/,";")} NF>1{print $1 "," $3}' RS=/ file
1 Like

Hi Scrutinizer ..

I get this error
gawk: fatal: Unmatched [ or [^: /[][:]/

Do I need to escape something ?

thanks ...

Change -F '[][:]' to -F '[]:[]' instead.

2 Likes