在制表符分隔文件的所有列中将负数替换为零

时间:2017-03-16 15:19:48

标签: perl awk sed

我想用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

事先谢谢! 最好!

3 个答案:

答案 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