我有一个表,其中包含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
答案 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
。