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

AWK - Replacing Value Of Selected Column Destroys Output Format

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

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

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

我想要什么:100|James|2015

我得到的是:100 James 2015

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

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

awk -F\| -v OFS=\| '{print , ,  }'  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