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