在AWK中比较字符串与各种数字

时间:2016-09-24 17:06:58

标签: linux awk

用一个例子来解释它会容易得多:

说我有像这样的字符串

stringhead034endstring 12
stringhead212endstring 32
stringhead234endstring 23

所以他们全部采用格式stringhead???endstring

我怎么能在一个组中操纵和玩它们,无论它们拥有多少,比如将它们存储在数组mystring[$1]中?如果我尝试过,他们都会有所不同。

如果不确定问题是否清楚,我会尽量详细说明。

我试图将所有这些字符串存储在一个单独的数组元素中,比如myarray [" mystring"],然后操纵它们旁边的数据。我正在使用类似的东西

{ myarray[$1] += ($1 == "mystring???endstring") * $2 } # Add the value if true

然而,这显然不会起作用,因为有几个不同的字符串都被他们所拥有的数字区分开来,但我想忽略它。

所需的输出类似于mystringendstring 67

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果我理解正确:

% awk '{
   num=gensub(/stringhead([0-9]+)endstring/, "\\1", 1, $1);
   arr[$1] += num * $2
}
END{
    for (a in arr) {print a, arr[a]}
}' file

输出

stringhead034endstring 408
stringhead234endstring 5382
stringhead212endstring 6784

答案 1 :(得分:1)

$ cat ip.txt 
stringhead034endstring 12
stringhead212endstring 32
stringhead234endstring 23

$ awk '$1 ~ /stringhead.{3}endstring/{ sum += $2 } END {print "mystringendstring " sum}' ip.txt 
mystringendstring 67
  • $1 ~ /stringhead.{3}endstring/匹配第一个字段。 .{3}表示任何角色三次。如果需要,可将其更改为[0-9]+以匹配一个或多个数字,或[0-9]{3}正好匹配三位数
  • 问题提到单个元素数组,所以我自由地使用一个简单的变量来实现目的,以获得OP提到的预期输出