0

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

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

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

我想要的是 : 100|James|2015

我得到什么:100 James 2015

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

4

2 回答 2

3

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

awk -F\| -v OFS=\| '{print $1, $2, $3 }'  test.psv 
  • 为变量-v OFS=\|赋值。它是块的替代品。OFS|BEGIN { OFS = "|" }
  • |需要从外壳保护,因为外壳级别的含义是将一个命令输出管道传输到另一个命令的输入。使用"|"or\|是两种方法。
于 2016-03-20T13:24:07.123 回答
2

永远不要让 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
于 2016-03-20T13:32:07.453 回答