我想用sed或awk替换,甚至用perl 所有负数替换零。只是负数,我说这是因为有负南(-nan)而我想保留它。但是知道如何改变" -nan"如果我将来需要,将字符串转换为零值。
我找到了一些与负值替换相关的答案,但仅针对一个特定的列,在我的情况下,我至少有9列具有正数和负数(从第2列到第9列)
我告诉你一个输入文件的例子:
00001 0.0110712 -0.00113939 -3.67103e-05 0.013348 0.000541701 -nan 0.0086972 0.0130983 0.000482555
00002 0.346079 0.0195448 0.00891779 0.327209 0.00170761 0.000914081 0.28396 0.32112 0.00071226
00003 0.000468029 -nan -nan 0.000470196 -nan -nan 6.86508e-05 0.000428319 -nan
事先谢谢! 最好!
答案 0 :(得分:1)
与零比较似乎在awk中起作用:
$ awk -vOFS='\t' '{for(i=1;i<=NF;i++)if($i<0)$i=0}1' file
00001 0.0110712 0 0 0.013348 0.000541701 -nan 0.0086972 0.0130983 0.000482555
00002 0.346079 0.0195448 0.00891779 0.327209 0.00170761 0.000914081 0.28396 0.32112 0.00071226
00003 0.000468029 -nan -nan 0.000470196 -nan -nan 6.86508e-05 0.000428319 -nan
对于评论中提出的其他要求,如果您还想将“-nan”值更改为零,则可以写:
awk -vOFS='\t' '{for(i=1;i<=NF;i++)if($i<0||$i=="-nan")$i=0}1' file
或者如果您想将“-nan”值更改为“NaN”,您可以执行以下操作:
awk -vOFS='\t' '{for(i=1;i<=NF;i++){if($i<0)$i=0;if($i=="-nan")$i="NaN"}}1' file
答案 1 :(得分:1)
它标记了perl,所以:
perl -lane 'print join "\t", (map { $_ < 0 ? 0 : $_ } @F)'
答案 2 :(得分:1)
使用sed:
sed 's/\([[:space:]]*\)-[0-9.e-]\{1,\}/\10/g' file
或使用ERE:
sed -r 's/(\s*)-[0-9.e-]+/\10/g' file