AWK - 替换所选列的值会破坏输出格式



我有一个具有以下格式的.csv文件。 id|name|date

我正在使用以下 Awk 命令更改一行中的特定列,它可以工作。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv

我想保存输出,但是格式被破坏了。

我想要的:100|James|2015

我得到的 : 100 James 2015

如何避免第二个,并获得第一个?

您可以设置 OFS,即输出字段分隔符,如以下示例所示:

awk -F| -v OFS=| '{print $1, $2, $3 }'  test.psv 
  • -v OFS=| |OFS变量分配值。它是BEGIN { OFS = "|" }块的替代方法。
  • 需要保护|免受 shell 的影响,因为 shell 级别的含义是将一个命令输出管道传输到另一个命令的输入中。使用 "|"| 是两种方法。

永远不要让 shell 变量扩展成为 awk 脚本主体的一部分:

awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv

因为它会在给定这些 shell 变量的各种值的情况下出现阴险的错误。而是从 shell 变量填充 awk 变量,并在脚本中使用 awk 变量:

awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv

但是,当您为字段分配值时,awk 会重建记录,因此您需要 OFS 具有与 FS 相同的值:

awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv

相关内容

  • 没有找到相关文章

最新更新