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

Moh*_*OUI 1 csv bash awk

我想将一个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)

我错过了什么?

fed*_*qui 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
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)

  • @MedAli你似乎也不太明白`7`在这种情况下的作用.因为它不为零,所以它被视为真实的awk."$ 2 = 0.0"也是如此,但它被认为是错误的.所以从技术上讲,你的第一个命令(在问题中)被称为'$ 2 = 0.0 {print $ 0}; 7 {print $ 0}'`或`'false {print $ 0}; true {print $ 0}`. (2认同)