【问题标题】:Summing up the rows that have the same name awk总结具有相同名称的行 awk
【发布时间】:2013-04-02 05:17:47
【问题描述】:

我有三排。 第一行和第二行有数字,第三行有名字。 使用 awk,如何将与名称相关的所有数字相加。名字可能是随机的, 所以我可能需要一个变量。例如,它可能看起来像这样

100   221   dog
121   324   cat
42    4341  fish
12    23    cat
2134  424   dog

所以输出应该包含所有出现的狗、猫和鱼的第 1 行和第 2 行的所有数字。 有点像

dog 2879
cat 480
fish 4383

【问题讨论】:

  • 样本输入有 5 行 3 列。 “我有三行”这句话是“行”这个词的错误用法。

标签: awk


【解决方案1】:

试试这个单线:

awk '{a[$3]+=($1+$2)}END{for(x in a)print x, a[x]}' file

【讨论】:

    【解决方案2】:
    awk '
    {
       name[$3] += $1 + $2
    }
    END { for (n in name) { print n, name[n]; } } ' datafile
    

    【讨论】:

    • 为什么在加法上使用 int() 并在打印上使用尾随分号?
    • int() 对于这个答案是不正确的。分号是分隔多个语句的习惯。在这种情况下,这是多余的。
    • 知道了。我想也许 int() 调用做了一些事情来保证a += b + c 的行为类似于a += (b + c) 而不是(a += b) + c。我确实怀疑分号是多余的。
    • int() 返回整数值。如果简报要求整数是合适的 - 但它没有!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2020-09-09
    • 2011-11-20
    • 2021-06-07
    相关资源
    最近更新 更多