无法分开分号分隔线awk

时间:2013-09-05 10:58:20

标签: bash awk

我正在尝试执行以下操作:

  1. 逐行读取文件。
  2. 每一行都有以下结构:field1;field2;field3
  3. 使用awk分隔每个字段,然后进一步处理其中的每个字段
  4. 我的代码片段是:

    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 
    

    其中temp仅包含以下行:

    xx;yy;zz  
    

    我在命令行上得到的答案是:

    1 xx;yy;zz
    

    我不确定我理解这个输出。任何解释都会很好,因为它确实适用于其他文件。我正在使用Mac,而此代码在awk脚本中使用bash

3 个答案:

答案 0 :(得分:8)

为什么你可以用纯粹的bash来做awk?

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

或者,如果您不知道字段数:

while IFS=';' read -ra fields; do        
    echo "Number of fields: ${#fields[@]}"
    echo "Field1 ${fields[0]}"
done < file.txt

答案 1 :(得分:4)

你的awk不知道--field-separator=";"的意思,所以当你这样做时:

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

你的awk仍然使用空格的默认FS,所以$ 1包含你的整个输入行,而$ 2和$ 3是空的。使用-F';'设置FS。

你是如此,在如何编写你想要的脚本方面做得不好。如果您告诉我们更多关于“处理每个领域”的内容,我们可以帮助您。

答案 2 :(得分:3)

这可能是你的awk的一个错误。尝试其他类似的格式:

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 

或者

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 

或者

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 

尝试其他问题,例如mawknawk