以值为基础替换文件中的值

时间:2015-03-05 09:55:12

标签: awk sed

我的文件中包含的数字范围为10.00-10.6620.67-21.3330.67-31.3340.34-42.00

示例输入:

10.21  21.12  10.50  30.80
30.91  31.12  31.00  10.30
21.21  20.99  20.90  31.20
41.71  41.72  10.10  41.80

我想将文件转换为:

10.00-10.20 = 0|0:[DOSE]
10.21-10.66 = .|.:[DOSE]
20.90-21.10 = 1|0:[DOSE]
20.67-20.89 = .|.:[DOSE]
21.11-21.33 = .|.:[DOSE]
30.90-31.10 = 0|1:[DOSE]
30.67-30.89 = .|.:[DOSE]
31.11-31.33 = .|.:[DOSE]
41.80-42.00 = 1|1:[DOSE]
41.34-41.79 = .|.:[DOSE]

示例输出:

.|.:10.21  .|.:21.12  .|.:10.50  .|.:30.80
0|1:30.91  .|.:31.12  0|1:31.00  .|.:10.30
.|.:21.21  1|0:20.99  1|0:20.90  .|.:31.20
.|.:41.71  .|.:41.72  0|0:10.10  1|1:41.80

我可以想到在R中执行此操作的方法,但实际文件大小约为1000 * 5000000个元素,我不认为R可以应付!

有没有办法通过内嵌文本编辑器(如sed或awk)有条件地替换文件中依赖于其值的所有元素?欢迎替代方案!

1 个答案:

答案 0 :(得分:2)

在awk中执行此操作的简单方法是:

{
    for (i=1;i<=NF;++i) {
        if ($i>=10&&$i<=10.2) $i="0|0:"$i
        else if ($i>=10.21&&$i<=10.66) $i=".|.:"$i
        # etc.
    }
    print
}

也就是说,循环遍历每个记录的每个字段,并根据字段的值添加所需的字符串。您可以将脚本放在一个文件中,然后像awk -f script.awk input_file

一样运行它