我需要帮助格式化下面的文件,并对具有某种模式的特定行进行一些计算
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脚本中使用其他命令,我也可以实现
答案 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'
注意: 此答案不会保留已执行计算的行的原始空格