0

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.

9
  • @GURUSINGH, Will Name field have spaces in between them or any other field? Commented Nov 30, 2019 at 15:25
  • If there are multiple names in EMAIL then it will be a comma in between them. Commented Nov 30, 2019 at 15:30
  • @GURUSINGH, No, I meant for Name column. I got the email part, how about Name column? Commented Nov 30, 2019 at 15:31
  • your project will be much easier to manage if you can use either tab-char or | as the field separator for your data. Good luck. Commented Nov 30, 2019 at 15:45
  • 1
    You are likely to get better feedback if you will clarify what is failing. 'Failing in case of multiple items` is not clear. Splitting the problem over multiple posts unlikely to get any complete answer: stackoverflow.com/questions/58998007/…, stackoverflow.com/questions/59021512/… Commented Dec 1, 2019 at 0:36

1 Answer 1

3

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.

Sign up to request clarification or add additional context in comments.

2 Comments

thanks for your help. your code works like charm.I need one little help too, that now how to pass these arguments to my script.
@GURUSINGH, Np. Please have 1 question and 1 thread only, you could open a new thread with your EFFORTS which you have put in order to solve your own problem, cheers and happy learning.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.