【问题标题】:How to grep ranges of numeric sequences from a column that contain several sequences如何从包含多个序列的列中 grep 数字序列范围
【发布时间】:2017-02-04 23:53:32
【问题描述】:

我是新编写 bash 脚本并且有以下问题;如何从包含多个增量和减量数字序列的列中提取范围(第一个和最后一个值),这些数字序列可以增加或减少 3,并在检测到增量大于 3 时跳转到下一个序列,例如:

1
4
7
20
23
26
100
97
94

需要作为输出接收:

1,7
20,26
100,94

【问题讨论】:

标签: arrays sorting awk sed grep


【解决方案1】:

这个 awk 脚本会为您提供预期的输出:

awk '{v=$NF}
    NR==1{printf "%s,",v;p=v;next}
    (p-v)*(p-v)==9{p=v;next}
    {printf "%s\n%s,",p,v;p=v}
    END{print v}' file

【讨论】:

    【解决方案2】:

    使用 awk:

    $ awk 'NR==1||sqrt(($0-p)*($0-p))>3{print p; printf "%s", $0 ", "} {p=$0} END{print $0}' file
    
    1, 7
    20, 26
    100, 94
    

    解释:

    NR==1 || sqrt(($0-p)*($0-p))>3 {  # if the abs($0-previous) > 3
        print p                       # print previous to end a sequence and
        printf "%s", $0 ", "          # start a new sequence
    } 
    { p=$0 } 
    END { print $0 }
    

    【讨论】:

    • 感谢 James 提供并解释的解决方案,它符合我当前的需求。干杯。
    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多