繁体   English   中英

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

[英]How To Increment Matching Pattern Of Number In File With 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

在将数字增加小数点后保留格式的正确方法是什么?

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

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

输出为:

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

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

    $ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM