7

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

  1. 逐行读取文件。
  2. 每行具有以下结构:field1;field2;field3
  3. 用于awk分隔这些字段中的每一个,然后进一步处理这些字段中的每一个

我的代码片段是:

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 上工作,而这段代码awkbash脚本中使用。

4

3 回答 3

7

当你可以在纯 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
于 2013-09-05T11:23:41.637 回答
5

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

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

您的 awk 仍在使用空间的默认 FS,因此 $1 包含您的整个输入行,而 $2 和 $3 为空。用于-F';'设置 FS。

在如何编写你想要的脚本方面,你是 WAY,WAY 偏离了标记。如果您告诉我们更多关于“处理每个字段”是什么的信息,我们可以为您提供帮助。

于 2013-09-05T13:28:20.140 回答
2

这可能是您的 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 

尝试其他 awks,例如mawkor nawk

于 2013-09-05T11:24:00.027 回答