【问题标题】:BASH: Find maximum value in repeating groupsBASH:在重复组中查找最大值
【发布时间】:2015-05-01 23:45:47
【问题描述】:

我有以下 csv 文件file1.csv

sales,artist
10,0131
10,0131
10,10_000 Maniacs
10,1000names
15,E1001 Ways
15,E1001 Ways
10,S101 Strings Orchestra
10,D101 Strings Orchestra
10,x0cc
10,x0cc

我正在编写一个 BASH 命令来查找每个艺术家的总销售额。输出按总销售额降序排列。

Expected output.

30,E1001 Ways
20,0131
20,x0cc
10,10_000 Maniacs
10,1000names   
10,S101 Strings Orchestra
10,D101 Strings Orchestra

我编写了代码来查找最大值,但它给了我所有艺术家的最大销售额,而不是每个艺术家的总销售额最大值。

 sort -nr file1.csv | awk 'BEGIN { FS="," }{ print $2; }'

任何帮助解决这个问题? 谢谢。

输出

awk -F, 'NR > 1 { sales[$9] += $3 } END { for(s in sales) print sales[s] FS s }' million_songs_metadata_and_sales.csv | sort -nr -k1 | head -10

903,10000 Maniacs
562,51717
513,12012
506,35007
350,37500 Yens
2788,7000 Dying Rats
2325,2002
2210,1001 Ways
1992,1349
1968,1200 Techniques

【问题讨论】:

  • 如果以这种方式排序,则将其通过管道传送到awk,并在 ID E1001,0131 等发生更改时选择/打印第一个条目。希望这可以帮助。问候

标签: bash sorting csv awk grep


【解决方案1】:

使用 GNU awk:

awk -F, 'NR > 1 { sales[$2] += $1 } END { PROCINFO["sorted_in"] = "@val_num_desc"; for(s in sales) print sales[s] FS s }' file1.csv

那是

NR > 1 {                 # from the second line onwards (to skip the header)
  sales[$2] += $1        # sum up the totals
}
END {                    # and in the end

  # GNU-specific: array traversal in numerically descending order of value
  PROCINFO["sorted_in"] = "@val_num_desc"

  for(s in sales) {      # print the lot.
    print sales[s] FS s
  }
}

使用普通的 awk:

awk -F, 'NR > 1 { sales[$2] += $1 } END { for(s in sales) print sales[s] FS s }' file1.csv | sort -nr

也就是说,删除特定于 GNU 的 PROCINFO 位并将结果通过管道传输到 sort -nr

【讨论】:

  • 我需要找到每个艺术家的总销售额。我猜你发现的是每位艺术家的最大销售价值。
  • 哦,我误会了。不过很容易修复——代码甚至变得更简单。见编辑。
  • 谢谢!这些值是正确的,但由于某种原因,排序顺序不是严格降序的。我正在使用普通的 awk。
  • 是的,您的 sort 工作方式不同,这很奇怪,因为它接受了 -n 选项。它似乎是按字典顺序而不是数字排序(这就是为什么以 9 开​​头的所有内容都排在最前面的原因)。如果我通过sort -nr 管道输出该输出,我会得到预期的输出。如果你运行sort --version,它会告诉你它是什么类型的吗?或者:您使用什么操作系统? Mac OS X?在这种情况下,请尝试不使用 -k1(希望我正确阅读了手册页)。
  • 嗯。那绝对不应该发生。我会好好思考的。编辑:您使用的是什么语言环境?如果您使用 GNU 解决方案运行LC_ALL=C awk,它是否有效? EDIT2:虽然这不应该在 awk 中产生影响。嗯。如果您使用通用 awk 解决方案并通过LC_ALL sort -rn 进行管道传输,那么它会做什么?
猜你喜欢
  • 2013-06-24
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多