用一个例子来解释它会容易得多:
说我有像这样的字符串
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
有什么想法吗?
答案 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}
正好匹配三位数