使用sed提取和操作数据

时间:2017-11-03 19:57:16

标签: bash awk sed

我有一个看起来像这样的文件:

Z: abcd1 (D2)
Z: abcd2 (D10)

目前我正在使用这段代码

grep -i Z out.txt | awk '{print "---- " $2 " --- " $3}' 

打印出类似这样的内容:

---- abcd1 ---  (D2)
---- abcd2 ---  (D10)

如何将sed传输到awk的末尾以移除括号并为每个数字添加2(例如:D2变为D4,D10变为D12)。我无法更改已存在的grep和awk行,只能管道sed。

---- abcd1 ---  D4
---- abcd2 ---  D12

3 个答案:

答案 0 :(得分:1)

我相信它可以在没有任何额外管道的情况下完成:

grep -i 'Z' out.txt \
| awk '{ k=substr($3,2,1); gsub("[^0-9]+","",$3); printf "---- %s --- %s%d\n",$2,k,$3+2 }' 

输出:

---- abcd1 --- D4
---- abcd2 --- D12

答案 1 :(得分:1)

您可以在一个awk脚本中完成所有操作,

$ awk '/^[zZ]/{gsub(/[()]/,"",$3); print "-----", $2, "---", $3}' file

----- abcd1 --- D2
----- abcd2 --- D10

我错过了添加2部分

$ awk '/^[zZ]/{gsub(/[()]/,"",$3); 
               d=substr($3,1,1); v=substr($3,2);  
               print "-----", $2, "---", d v+2}' file


----- abcd1 --- D4
----- abcd2 --- D12

如果您无法将之前的脚本管道更改为

  ... | awk '{$NF=substr($NF,2,1) substr($NF,3,length($NF)-3)+2}1'

---- abcd1 --- D4
---- abcd2 --- D12

答案 2 :(得分:0)

使用gnu sed,你可以管道

sed 'h;s/\(.*[^0-9]\)\([0-9][0-9]*\)/\2/;x;s/[0-9]*$//;x;s/^/echo $((2+/;s/$/))/e;H;x;s/\n//'