【问题标题】:Using sed to extract and manipulate data使用 sed 提取和操作数据
【发布时间】:2017-11-04 05:24:00
【问题描述】:

我有一个如下所示的文件:

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

【问题讨论】:

  • 我无法改变 - 为什么会这样?是锁定还是欠压?
  • 不要使用 sed 进行算术运算。将其通过管道传输到 awk。

标签: bash awk sed


【解决方案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

【讨论】:

  • 我只想使用额外的管道。不删除之前的 awk 和 grep
  • @identical123456,我们可以知道为什么吗?
  • 这很复杂。代码被冻结,但我可以添加额外的管道。很难解释
【解决方案2】:

您可以在一个 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 添加到数字中。
【解决方案3】:

使用 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//'

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2011-12-02
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多