Unable to separate semi-colon separated line awk

前端 未结 3 2100
傲寒
傲寒 2020-12-20 21:30

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
相关标签:
3条回答
  • 2020-12-20 21:39

    Why awk when you can do it in pure bash?

    while IFS=';' read -r field1 field2 field3; do
        echo "Field1: $field1"
        echo "Field2: $field2"
        echo "Field3: $field3"
    done < file.txt
    

    Or if you don't know the field count:

    while IFS=';' read -ra fields; do        
        echo "Number of fields: ${#fields[@]}"
        echo "Field1 ${fields[0]}"
    done < file.txt
    
    0 讨论(0)
  • 2020-12-20 21:43

    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 WAY, WAY 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.

    0 讨论(0)
  • 2020-12-20 22:00

    It's probably a bug with your awk. Try other formats like these:

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

    Or

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

    Or

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

    Try other awks like mawk or nawk as well.

    0 讨论(0)
提交回复
热议问题