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

Perl 将制表符分隔文件的所有列中的负数替换为零,perl,awk,sed,Perl,Awk,Sed,我想用sed或awk或者甚至在perl中用零替换所有负数。只有负数,我这样说是因为有负的nan(-nan),我想保留它。但如果知道如何将“-nan”字符串也更改为零值,以防将来需要 我找到了一些关于替换负值的答案,但只针对一个特定列,在我的例子中,我至少有9列带有正数和负数(从第2列到第9列) 我向您展示了我的输入文件示例: 00001 0.0110712 -0.00113939 -3.67103e-05 0.013348 0.000541701 -nan 0.0086

我想用sed或awk或者甚至在perl中用零替换所有负数。只有负数,我这样说是因为有负的nan(-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
事先谢谢!,
最好的

仅与零进行比较似乎在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
$awk-vOFS='\t'{for(i=1;i它被标记为perl,因此:

perl -lane 'print join "\t", (map { $_ < 0 ? 0 : $_ } @F)'
perl-lane'print join“\t”,(map{$\<0?0:$\}@F)'
使用sed:

sed 's/\([[:space:]]*\)-[0-9.e-]\{1,\}/\10/g' file
或使用ERE:

sed -r 's/(\s*)-[0-9.e-]+/\10/g' file

为什么你不知道你在用什么语言?你的代码在哪里?你有什么问题吗?@ikegami我在用sed和awk使用这些代码:awk'{$0=($0I…必须…向上投票…负…-1…到…零…你能解释一下lane和@F的作用吗,剩下的我都知道了。谢谢它能工作,但我不知道perl和awk中哪一个能持续更长时间,所以如果你有任何关于哪个程序能比其他@Sobriqueit更快的想法,也可以将“-nan”改为“0nan”谢谢,它能工作,但我想知道哪种代码适合这样做,awk、sed、perl……我正在寻找更快的方法,我想知道如何将“-nan”值也更改为零。一些建议?谢谢,它能正确工作!我现在想知道的是:如何将“-nan”的值也更改为零或更改为“nan”为了在R使用这张桌子。谢谢lot@Gaferolo:我又添加了两个示例,其中包含附加要求。
sed 's/\([[:space:]]*\)-[0-9.e-]\{1,\}/\10/g' file
sed -r 's/(\s*)-[0-9.e-]+/\10/g' file