我想将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
我错过了什么?
答案 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
以跳过该第一行的剩余操作。