使用awk替换范围内的值

时间:2015-09-07 01:39:16

标签: bash awk

我有一组值,我希望在shell范围内替换值,从(0.24,0.26)到0.25

  

数据集

     

0.2756685694253216 0.2465880581619878 0.7465232826513566     0.7854901474348578 0.7462693536319435 0.7461233186289065     0.3040440234554627 0.7469959968223604 0.7470544151095436     0.8715102764854729 0.7462219592218707 0.2459733266406937     0.2756682582853889 0.7465457641342352 0.2465506594547140

我知道awk命令可能对Replace range of numbers with certain number中的建议有所帮助。

因此我使用

awk '/^0.[0-9]*$/{if ($1 > 0.24 && $1 < 0.26) print 0.25}{print}' datasets

但它似乎只打印整个文件..(可能已经解决了示例或错误的语法,请直接评论。)

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

看起来你应该使用更像的东西:

awk '{ for (i = 1; i <= NF; i++)
           if ($i > 0.24 && $i < 0.26) $i = 0.25
       print}' datasets

对于每个字段,如果它是给定范围内的值(对于相等的分支是否正确?),则将该值替换为代理项;然后打印线。

您没有显示任何包含非数字数据的行,因此我删除了过滤条件;如果你只告诉我们故事的一部分,你当然可以把它放回去。

如果您的输入被打破,每行最多4个数字:

0.2756685694253216 0.2465880581619878 0.7465232826513566 0.7854901474348578
0.7462693536319435 0.7461233186289065 0.3040440234554627 0.7469959968223604
0.7470544151095436 0.8715102764854729 0.7462219592218707 0.2459733266406937
0.2756682582853889 0.7465457641342352 0.2465506594547140

我得到了输出:

0.2756685694253216 0.25 0.7465232826513566 0.7854901474348578
0.7462693536319435 0.7461233186289065 0.3040440234554627 0.7469959968223604
0.7470544151095436 0.8715102764854729 0.7462219592218707 0.25
0.2756682582853889 0.7465457641342352 0.25

如果您希望保留更多的对齐方式,则必须更加努力,可能会在字段中分配字符串"0.2500000000000000"

$ awk '{ for (i = 1; i <= NF; i++)
>            if ($i > 0.24 && $i < 0.26) $i = "0.2500000000000000"
>        print}' datasets
0.2756685694253216 0.2500000000000000 0.7465232826513566 0.7854901474348578
0.7462693536319435 0.7461233186289065 0.3040440234554627 0.7469959968223604
0.7470544151095436 0.8715102764854729 0.7462219592218707 0.2500000000000000
0.2756682582853889 0.7465457641342352 0.2500000000000000
$
相关问题