我正在尝试执行以下操作:
field1;field2;field3
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 上工作,而此代码在
awk
脚本中使用 bash
。
你的 awk 不知道
--field-separator=";"
是什么意思,所以当你这样做时:
awk --field-separator=";" '{print $1}'
你的 awk 仍然使用空格的默认 FS,因此 $1 包含你的整个输入行,而 $2 和 $3 是空的。使用
-F';'
设置 FS。
你对于如何编写你想要的脚本没有把握。如果您告诉我们更多有关“处理每个字段”的信息,我们可以为您提供帮助。
当你可以在纯 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
这可能是你的 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,例如
mawk
或 nawk
。