查找匹配模式,执行计算和移动文件列

时间:2014-02-08 22:01:25

标签: sed awk

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

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

我需要通过对具有文本“check sum”的行执行减法来获得四个列文件。 我希望删除文本“Check sum”,然后减去()中给出的数字。对于例如(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脚本中使用其他命令,我也可以实现

2 个答案:

答案 0 :(得分: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

输出结果

答案 1 :(得分:0)

你可以尝试这一个班轮:

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'

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