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

时间:2016-03-20 13:14:19

标签: awk outputformat

我有一个.csv文件,格式如下。 id|name|date

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

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

我想要的是什么:100|James|2015

我得到了什么:100 James 2015

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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