awk sed过滤器值在所有行中大于/小于

时间:2013-06-11 19:02:53

标签: bash sed awk

有没有办法在awk(或类似的东西)中为给定文件构建一个过滤器,比如说:

0.99,0.98,1.1,0.85,0.92
0.76,1.4,0.99,0.99,0.82
1.0,1.45,0.78,0.91,0.95

会用1.0?

替换大于1.0的行中的任何记录

2 个答案:

答案 0 :(得分:10)

您可以使用awk

执行此操作
awk -F, '{for(i=1;i<=NF;i++) if($i>1) {$i="replacement"}}1' OFS=, file

测试:

$ cat file
0.99,0.98,1.1,0.85,0.92
0.76,1.4,0.99,0.99,0.82
1.0,1.45,0.78,0.91,0.95

$ awk -F, '{for(i=1;i<=NF;i++) if($i>1) {$i="replacement"}}1' OFS=, file
0.99,0.98,replacement,0.85,0.92
0.76,replacement,0.99,0.99,0.82
1.0,replacement,0.78,0.91,0.95

答案 1 :(得分:4)

这是一个sed解决方案:

sed -e 's/[1-9][0-9]*\.[0-9]*/1.0/g' in-file > out-file

模式[1-9][0-9]*\.[0-9]*只匹配任何以大于0的数字开头的序列,后跟零个或多个数字,后跟小数点,后跟其他数字。如果您想要就地替换,可以使用-i选项:

sed -i -e 's/[1-9][0-9]*\.[0-9]*/1.0/g' in-file