【问题标题】:get the top N counts based on the value of another column根据另一列的值获取前 N 个计数
【发布时间】:2020-05-01 21:58:51
【问题描述】:

我有一个包含两列的文件,如下所示:

a 3
a 7
b 6
a 6
b 1
b 8
c 1
b 1

对于第一列中的每个值,我想从第二列中找到前 N 个计数。使用此示例,我想为第 1 列中的每个字符串在第 2 列中查找前 2 个值。所需的输出将是:

a 7
a 6
b 8
b 6
c 1

我试图用 awk 做这样的事情,但我对它不是很熟悉。这给出了最大值,而不是前 N 个:

awk '$2>max[$1]{max[$1]=$2; row[$1]=$0} END{for (i in row) print row[i]}'

【问题讨论】:

  • 你做了哪些努力?
  • 感谢您的帮助。我试图使用 awk 将数据存储在数组中,但我对 awk 以及如何将数字输出限制为前 N 没有太多经验。

标签: unix awk


【解决方案1】:

您能否尝试关注,使用sort + awk 解决方案。

sort -k2 -s -nr Input_file | awk '++array[$1]<=2' | sort -k1,1 -k2,2nr

sort -k2 -s -nr Input_file | sort -k1,1 -k2,2nr | awk '++array[$1]<=2'

逻辑简要说明: 前 2 个排序命令用于按第 1 和第 2 个字段对数据进行排序,以按正确的顺序获取数据(根据 OP 的示例),然后将其输出传递给awk,以仅根据询问仅获得每个第一个字段的第 2 次出现。

【讨论】:

    【解决方案2】:
    $ sort -k1,1 -k2,2rn file | awk -v n=2 '(++cnt[$1])<=n'
    a 7
    a 6
    b 8
    b 6
    c 1
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2021-09-22
      • 2016-03-12
      • 2020-12-30
      • 2020-12-22
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多