从bash变量中拆分文本

时间:2019-03-10 15:47:07

标签: bash scripting

我有一个包含数字组的变量。看起来像这样:

foo 3
foo 5
foo 2
bar 8
bar 8
baz 2
qux 3
qux 5
...

我想拆分这些数据,以便一次可以处理一个“组”。我觉得通过某种方式实现循环是可以实现的。最终目标是取每个组的平均值,这样我就可以拥有:

foo 3.33
bar 8.50
baz 5.00
qux 4.00
...

这意味着采取行动已经实施,但是我已经提出来,因此可以了解上下文。

请务必注意,每个组(例如foo,bar,baz)的长度都是任意的。

我该如何拆分这些小组?

1 个答案:

答案 0 :(得分:2)

我将使用awk(这里使用GNU版本gawk进行了测试,但我认为是可移植的)来进行收集和平均。作为coreutil,它几乎应该安装在任何安装bash的计算机上。

# print_avg.awk
{
    sums[$1] += $2
    counts[$1] += 1
}
END {
    for (key in sums)
        print key , sums[key] / counts[key]
}

data.txt:

foo 3
foo 5
bar 8
bar 8
baz 2
qux 3
qux 5

运行方式:

$ awk -f print_avg.awk data.txt 
foo 4
baz 2
qux 4
bar 8