6

我有这种格式的输出:

Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)

我想提取最后一对大括号中的最后两个数字。有时,最后一对大括号中只有一个数字。

这是我使用的代码。

echo "Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)" | \
  tr "," " " | tr "(" " " | tr ")" " " | awk -F: '{print $4}'

提取值的更干净的方法是什么?还是更优化的方式?

4

3 回答 3

14

试试这个:

awk -F '[()]' '{print $(NF-1)}' input | tr -d ,

这是对您的命令的一种重构。

于 2012-08-15T23:51:50.573 回答
3
 awk -F\( '{gsub("[,)]", " ", $NF); print $NF}' input

会给

 33389  94934 

在这个问题的上下文中,我有点不清楚“最佳”/“专业”的含义,但这仅使用一个命令/工具,不确定是否符合条件。

基于@kev 的方法(但不需要tr消除逗号):

awk -F'[(,)]' '{print $4, $5}' input

输出:

33389  94934
于 2012-08-15T23:58:58.970 回答
1

这也可以在纯 bash 中完成。假设文本总是看起来像问题中的示例,以下应该有效:

$ text="Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)"
$ result="${text/*(}"
$ echo ${result//[,)]}
33389 94934

这使用 shell “参数扩展”(您可以在 bash 的手册页中搜索)以与使用tr. 严格来说,第二行中的引号不是必需的,但它们有助于 StackOverflow 语法高亮。:-)

您也可以通过查找您感兴趣的实际字段来使其更加灵活。如果您使用的是 GNU awk,则可以使用多个字符指定 RS:

$ gawk -vRS=" - " -vFS=": *" '
  { f[$1]=$2; }
  END {
    print f["data-info-ids"];
    # Or you could strip the non-numeric characters to get just numbers. 
    #print gensub(/[^0-9 ]/,"","g",f["data-info-ids"]);
  }' <<<"$text"

我更喜欢这种方式,因为它实际上解释了输入数据的本质——表示某种数组的结构化文本。

于 2012-08-16T02:24:33.390 回答