无法分开分号分隔线awk

Sri*_*ram 5 bash awk

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

  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 
Run Code Online (Sandbox Code Playgroud)

其中temp只包含以下行:

xx;yy;zz  
Run Code Online (Sandbox Code Playgroud)

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

1 xx;yy;zz
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*-A. 8

为什么awk什么时候你可以用纯粹的bash做到这一点?

while IFS=';' read -r field1 field2 field3; do
    echo "Field1: $field1"
    echo "Field2: $field2"
    echo "Field3: $field3"
done < file.txt
Run Code Online (Sandbox Code Playgroud)

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

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


Ed *_*ton 7

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

awk --field-separator=";" '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为何如此居高临下?`--field-separator=";"` 在我的机器上工作,不是问题。awk 手册页甚至指定了它:“-F fs 或 --field-separator fs,使用 fs 作为输入字段分隔符(FS 预定义变量的值)。”至于偏离目标:我同意,但是也许您可以提供更好的解决方案,就像其他一些人所做的那样。 (7认同)