Search code examples
bashawk

Unable to separate semi-colon separated line awk


I am trying to do the following:

  1. Read a file line by line.
  2. Each line has the following structure: field1;field2;field3
  3. Use awk to separate each of these fields and then process each of these fields further

The snippet of code I have is:

while read l
do
n=`echo ${l} | awk --field-separator=";" '{print NF}'`
field1=`echo ${l} | awk --field-separator=";" '{print $1}'`
field2=`echo ${l} | awk --field-separator=";" '{print $2}'`
field3=`echo ${l} | awk --field-separator=";" '{print $3}'`
echo ${n} ${field1} ${field2} ${field3} 
done < temp 

Where temp contains only the following line:

xx;yy;zz  

The answer I get on the command line is:

1 xx;yy;zz

I am not sure I understand this output. Any explanations would be nice, given that it does work for other files. I am working on a Mac while this code uses awk within a bash script.


Solution

  • Your awk has no idea what --field-separator=";" means so when you do this:

    awk --field-separator=";" '{print $1}'
    

    your awk is still using the default FS of a space, and so $1 contains your whole input line while $2 and $3 are empty. Use -F';' to set the FS.

    You are off the mark in how to write the script you want. If you tell us more about what "process each field" is, we can help you.