我有一组值,我希望在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
但它似乎只打印整个文件..(可能已经解决了示例或错误的语法,请直接评论。)
非常感谢你的帮助。
答案 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
$