我有一个看起来像这样的文件:
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
答案 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//'