我想将一个csv文件的一列归零.我们假设csv文件如下所示:
col1|col2|col3
v | 54| t
a | 25| f
d | 53| f
s | 04| t
Run Code Online (Sandbox Code Playgroud)
以这种方式使用awk,几乎给了我想要的东西
命令:
awk -F'|' -v OFS='|' '$2=0.0;7' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)
结果
col1|0|col3
v |0| t
a |0| f
d |0| f
s |0| t
Run Code Online (Sandbox Code Playgroud)
但请注意,列标题也已归零,这是我试图避免的.所以我试图用awk命令跳过第一行,但我得到一个空文件
awk -F'|' -v OFS='|' 'NR<1 {exit} {$5=0.0;7}' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
只需应用第二行中的规则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
Run Code Online (Sandbox Code Playgroud)
为什么你的方法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
Run Code Online (Sandbox Code Playgroud)