【问题标题】:finding matching pattern, performing calculations and shifting the columns of file查找匹配模式,执行计算并移动文件的列
【发布时间】:2014-02-09 19:42:10
【问题描述】:

我需要帮助来格式化下面的文件,并对具有某种模式的特定行进行一些计算

hnt     1       454     454
gft         10          8844        8853
step        2       23      24
str     10     Check sum(00244-00240)   420 434
dert        03      14      16
ghh     33     Check sum(12366-12361)   8008    8046

我需要通过对具有文本“校验和”的行执行减法来获得四列文件。 我希望删除文本“校验和”,然后减去 ( ) 中给出的数字。例如(00244-00240) 将被减去并且将具有值“4”并且这个“4”将被添加到具有值“10”的左列。 所以现在这个值将变成'14'。在此计算之后,该行上的其他值将按列向左移动。从而制作四列表格而不是六列

想要的输出是

hnt     1       454     454
gft         10          8844        8853
step        2       23      24
str     14      420     434
dert        03      14      16
ghh     38      8008        8046

我是 shell 脚本的新手,感谢您帮助我使用 awk 或 sed 或同时使用两者来获得所需的输出。如果不使用 awk 和 sed 以及在 unix shell 脚本中使用其他命令也可以实现这一点,我也可以

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    Perl 可以做解析和加法:

    perl -pe 's/(\d+)\s+Check sum\((\d+)([+-]\d+)\)/$1+$2+$3/e' file
    
    hnt     1       454     454
    gft         10          8844        8853
    step        2       23      24
    str     14   420 434
    dert        03      14      16
    ghh     38   8008    8046
    

    如果您希望输出看起来更漂亮,请将结果通过column -t 管道化

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      sed "s/Check//;s/sum//;s/(//;s/)//" filename|awk '/-/{sub(/-/," ");for (i=1;i<=NF;i++);{calc=$3-$4;$2=$2+calc;$3="";$4=""}}1'
      

      注意: 此答案不保留已执行计算的行的原始空格

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 2021-12-12
        • 1970-01-01
        • 2017-10-25
        • 2018-12-09
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多