Search code examples
arraysbashshellawkmap-files

Parse columns into separate arrays


I have a space-delimited file:

Pool    Library Name    Email   Subject
Finland lib1    Guru    [email protected],[email protected]   Finland Media Rotation
Tucson  lib2    Albert  [email protected] Tucson Media Rotation
Vancouver   lib3    Jeff    [email protected] Vancouver Media Rotation

I want to parse the columns into arrays like:

declare -a Pool=(Finland Tucson Vancouver)
declare -a Library=(lib1 lib2 lib3)
declare -a Name=(Guru Albert Jeff)
declare -a Email=("[email protected],[email protected]" [email protected] [email protected]) 

My code is:

column=1
for arrayname in Pool Library; do
     mapfile -t "$arrayname" < <(awk "NR > 1 {print \$$column}" file.txt)
     ((column++))
done

But it's failing in case of multiple items like in Email.


Solution

  • Could you please try following.

    awk -v s1="\"" '
    FNR==1{
      for(i=1;i<=NF;i++){
        header[i]=$i
      }
      val=length(header)
      next
    }
    {
      match($0,/.*\.com +/)
      string=substr($0,RSTART,RLENGTH)
      num=split(string,array," ")
      for(i=1;i<=num;i++){
        values[i]=(values[i]?values[i] OFS:"")s1 array[i] s1
      }
      values[num+1]=(values[num+1]?values[num+1] OFS:"")substr($0,RSTART+RLENGTH)
      delete array
    }
    END{
      for(i=1;i<=val;i++){
        print "declare -a " header[i] "=(" values[i]")"
      }
    }
    '  Input_file
    

    This will print the array creation commands on terminal, you could use the as per your need.