如何使用Awk / Sed增加文件中数字的匹配模式?

时间:2018-02-05 02:00:14

标签: linux bash shell awk sed

我目前有一个由标签分隔的文件,我试图将第三列增加0.05。

示例:

2999    comp  .20

2993    EE    .10

2949    CS    .17

2799    CE    .30

我希望得到以下结果:

2999    comp  .25

2993    EE    .15

2949    CS    .22

2799    CE    .35

到目前为止,我尝试使用返回以下内容的awk '{sub(/[[:digit:]]+$/,$NF+.05)}1' filename.txt

2999    comp  .0.3

2993    EE    .0.2

2949    CS    .0.27

2799    CE    .0.4

在将数字递增小数的同时保留格式的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

如果要在列之间保留TAB,请输入以下代码:

awk -v OFS='\t' '$3+=0.05' [Your_File]

输出是:

2999    comp  .25
2993    EE    .15
2949    CS    .22
2799    CE    .35

答案 1 :(得分:1)

我认为解析字符串是最简单的方法。

    $ cat r.sh
    # w, s: regexps matching "word" or "space" (delimiter)
    # nxt(): sets T (type: "W" or "S") and P (pattern), and "eats" $0
    # pp[], tt[]: parallel arrays with patterns and types
    awk '
    function transform(t, cnt, x) {
        return (t == "W" && cnt == 3 ) ? x + 0.05 : x
    }
    BEGIN {
        w = "^[^ \t]+"
        s = "^[ \t]+"
    }
    {
        for (n = 0; nxt(); n++) {
            pp[n] = P; tt[n] = T
        }

        for (iw = i = 0; i < n; i++) {
           if (tt[i] == "W") iw++
           printf "%s", transform(tt[i], iw, pp[i])
        }
        printf "\n"
    }
    function nxt() {
        if      (match($0, w)) {T = "W"; P = nxt0(); return 1 }
        else if (match($0, s)) {T = "S"; P = nxt0(); return 1 }
        else return 0
    }
    function nxt0(   p) {
        p =  substr($0, 1, RLENGTH)
        $0 = substr($0, RLENGTH + 1)
        return p
    }
    ' "$@"

用法:

$ sh r.sh file
2999    comp  0.25

2993    EE    0.15

2949    CS    0.22

2799    CE    0.35