排序以显示第1列中每个值的前2个条目

时间:2017-12-11 10:49:18

标签: sorting unix awk

我有一个表,其中包含3列,如下所示。产品品牌和产品列表(第1列和第2列)只有几百个条目

Product Brand   |   Product     |   Product Revenue
A               |   biscuit     |   20
B               |   bread       |   33
C               |   candy       |   41
A               |   frozen      |   52
B               |   icecream    |   89
B               |   veggies     |   65
C               |   juice       |   43
D               |   coffee      |   78
E               |   tea         |   21
C               |   chips       |   44
A               |   chips       |   29

使用unix命令,我可以获得每个品牌的前2个畅销产品(按收入递减)?

预期输出

Product Brand   |   Product     |   Product Revenue
A               |   frozen      |   52
A               |   chips       |   29
B               |   icecream    |   89
B               |   veggies     |   65
C               |   chips       |   44
C               |   juice       |   43
D               |   coffee      |   78
etc

3 个答案:

答案 0 :(得分:1)

head -n1 test  && tail -n+2 test | sort -k1,1 -k3r,3 | awk 'word!=$1{count=1;word=$1} count<=2{print; count++}'
Product Brand  |   Product     |   Product Revenue
A               |   frozen      |   52
A               |   chips       |   29
B               |   veggies     |   65
B               |   icecream    |   89
C               |   juice       |   43
C               |   chips       |   44
D               |   coffee      |   78
E               |   tea         |   21

<强>解释

  • 您可以使用命令head -n1 yourfile隔离标题,该命令只打印文件的第一行=标题。
  • &&合并命令
  • tail -n+2 test获取所有行但您的标题
  • sort -k1,1 -k3r,3 - 按第一个字段升序排序,然后按第三个字段降序排序
  • awk 'word!=$1{count=1;word=$1} count<=2{print; count++}' - 如果当前行中的第一个字与最后一个字符匹配,则重置我们的计数并存储新字:word!=$1{count=1;word=$1} 当我们的计数小于或等于2时,打印行和增量 数:count<=2{print; count++}

答案 1 :(得分:0)

请您试着跟随并告诉我这是否对您有帮助。

sort -t"|" -k1.1 -k3.1 Input_file | tac | awk -F' +| +' 'NR>1{if(++a[$1]<3){print | "sort -k1"};next} 1'

现在也添加非单线形式的解决方案。

sort -t"|" -k1.1 -k3.1 Input_file |
tac |
awk -F' +| +' '
  NR>1{
       if(++a[$1]<3){
         print | "sort -k1"
  };
next
}
1'

答案 2 :(得分:0)

sort -k1,1 -k5,5nr file | awk 'a[$1]++<2'

按第一列排序,其次按最后一列排序,数字和降序。然后awk只为每个品牌保留两个。这种语法意味着将每个品牌存储为关键,并为每个外观增加其价值。这种情况仅适用于前两次出现的情况。当它成立时它会打印出这条线。

注意:我不确定示例中是否有|个分隔符,我假设你有并且总是有空格,如果不是只是替换你想要的列号。如果您需要为这些命令中的任何一个设置分隔符,则-t'|'sort-F'|'awk