我有一个具有以下格式的.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