使用awk将csv文件中的列归零,同时跳过标题

时间:2015-07-08 09:51:30

标签: bash csv awk

我想将csv文件的一列归零。我们假设csv文件如下所示:

col1|col2|col3
v   |  54| t
a   |  25| f
d   |  53| f
s   |  04| t

以这种方式使用awk,几乎给了我想要的东西

命令:

awk -F'|' -v OFS='|'  '$2=0.0;7' input.csv > output.csv

结果

col1|0|col3
v   |0| t
a   |0| f
d   |0| f
s   |0| t

但请注意,列标题也已归零,这是我试图避免的。所以我尝试用awk命令跳过第一行,但我得到一个空文件

awk -F'|' -v OFS='|'  'NR<1 {exit} {$5=0.0;7}' input.csv > output.csv

我错过了什么?

2 个答案:

答案 0 :(得分:6)

只需使用NR>1 {}

从第二行开始应用规则
$ awk -F'|' -v OFS='|'  'NR>1{$2=0.0}7' file
col1|col2|col3
v   |0| t
a   |0| f
d   |0| f
s   |0| t

为什么你的方法awk -F'|' -v OFS='|' 'NR<1 {exit} {$5=0.0;7}'不起作用?

表达式NR<1{exit}永远不会为真,因为NR始终至少为1.

这意味着始终会评估第二个表达式{$5=0.0;7}$5=0.0很好,但7没有按照您的意愿打印,因为要打印一行,您需要某种print指令。如果您将7移到大括号外,它将会计算为True并且将打印记录:awk -F'|' -v OFS='|' 'NR<1 {exit} {$5=0.0}7'

但这不会做你想要的。相反,您可能想说NR==1 {next}跳过第一行。但是,这样可以防止它被打印出来:

$ awk -F'|' -v OFS='|'  'NR==1{next} $2=0.0;7' file
v   |0| t
a   |0| f
d   |0| f
s   |0| t

答案 1 :(得分:2)

exit更改为next以跳过该第一行的剩余操作。