Search code examples
awkcsh

Is awk 2 dimension array or something similar to store value?


Hi all im new in awk can i ask i have a input file like this:

# ABC DEFG
value1 GH
value2 GH
value3 GH
# BCF SQW
value4 GH
value5 GH
# BEC YUW
value6 GH
value7 GH

Desire output:

##### ABC DEFG #####
DEFG_ABC
ABC_DEFG
value1 ABC
value1 DFG
value2 ABC
value2 DFG
value3 ABC
value3 DFG
##### BCF SQW #####
BCF_SQW
SQW_BCF
value4 BCF
value4 SQW
value5 BCF
value5 SQF
##### BEC YUW #####
BEC_YUW
YUW_BEC
value6 BEC
value6 YUW
value7 BEC
value7 YUW

I had seperate the file $2 and $3 in line have character # into array like this

awk '
/^#/ {
         a[na++] = $2
         b[nb++] = $3
}
END { 
       for(i = 0; i < na; i ++){
            print ("######" a[i] " " b[i] "#####")
            print (a[i] "_" b[i])
            print (b[i] "_" a[i])
       }
    }
' input

But i dont know how to store the $1 of all line between "#" line to the array anyone how to make it ? Thank you so much


Solution

  • With your shown samples, please try following awk code. Written and tested in GNU awk should work in any awk.

    awk '
    /^#/{
      sub(/^#/,"##### ")
      print $0,"  #####"
      val1=$2
      val2=$3
      print val1"_"val2 ORS val2"_"val1
      next
    }
    {
      print $1,val1 ORS $1,val2
    }
    ' Input_file
    

    Explanation: Adding detailed explanation for above.

    awk '                          ##Starting awk program from here.
    /^#/{                          ##Checking condition if line starts from #.
      sub(/^#/,"##### ")           ##Substituting starting # with #####
      print $0,"  #####"           ##Printing current line follows by ##### here.
      val1=$2                      ##Creating val1 which has 2nd field in it.
      val2=$3                      ##Creating val2 which has 3rd field in it.
      print val1"_"val2 ORS val2"_"val1  ##Printing val1 _ val2  newline val2 _ val1.
      next                         ##next will skip further statements from here.
    }
    {
      print $1,val1 ORS $1,val2    ##Printing 1st field val1 ORS 1st field val2 here.
    }
    ' Input_file                   ##Mentioning Input_file name here.