awk打印每个类别的前(第n行)三个最小值

awk打印每个类别的前(第n行)三个最小值,awk,Awk,希望根据每个类别的$1和$3组合打印前三个最小值。输入文件未按任何顺序排序。 期待你的建议 Input.txt Country,Desc,Amount,Details Abc,xxx,20,aaa Abc,yyy,10,aaa ghi,ttt,25,ccc Abc,zzz,5,aaa def,xxx,30,bbb Abc,ttt,15,aaa def,yyy,20,bbb ghi,yyy,25,ccc def,zzz,30,bbb ghi,xxx,35,ccc ghi,zzz,50,ccc de

希望根据每个类别的$1和$3组合打印前三个最小值。输入文件未按任何顺序排序。 期待你的建议

Input.txt

Country,Desc,Amount,Details
Abc,xxx,20,aaa
Abc,yyy,10,aaa
ghi,ttt,25,ccc
Abc,zzz,5,aaa
def,xxx,30,bbb
Abc,ttt,15,aaa
def,yyy,20,bbb
ghi,yyy,25,ccc
def,zzz,30,bbb
ghi,xxx,35,ccc
ghi,zzz,50,ccc
def,zzz,45,bbb
要将输出与标题行一起打印
NR==1,{print}

所需输出.txt

Country,Desc,Amount,Details
Abc,zzz,5,aaa
Abc,yyy,10,aaa
Abc,ttt,15,aaa
def,yyy,20,bbb
def,xxx,30,bbb
def,zzz,30,bbb
ghi,ttt,25,ccc
ghi,yyy,25,ccc
ghi,xxx,35,ccc
Country,Desc,Amount,Details
Abc,zzz,5,aaa
Abc,yyy,10,aaa
Abc,ttt,15,aaa
def,yyy,20,bbb
def,xxx,30,bbb
def,zzz,30,bbb
ghi,ttt,25,ccc
ghi,yyy,25,ccc
ghi,xxx,35,ccc

我会先对进行排序,然后通过管道连接到awk以选择前3行:

sort -t, -k1,1 -k3,3n file|awk -F, 'c!=$1{p=1;c=$1}p++<=3'
如果要重定向到某个文件:(如
result

head-1文件>结果;排序…>结果

我会先对进行排序,然后通过管道连接到awk以选择前3行:

sort -t, -k1,1 -k3,3n file|awk -F, 'c!=$1{p=1;c=$1}p++<=3'
如果要重定向到某个文件:(如
result

head-1文件>结果;排序…>结果
另一种排序+awk解决方案:

head -1 file && sort -t, -k1,1 -k3,3h <(tail -n +2 file) | awk -F, 'a[$1]++<3' 
另一种排序+awk解决方案:

head -1 file && sort -t, -k1,1 -k3,3h <(tail -n +2 file) | awk -F, 'a[$1]++<3' 
顺便说一句,我正在使用用于“稳定排序”参数的
-s
进行排序,这样就可以保证具有相同$1和$3值的输入行以其原始顺序出现


顺便说一句,我正在使用“稳定排序”参数的
-s
进行排序,这样就可以保证具有相同$1和$3值的输入行按其原始顺序显示出来。

您忘记了打印输出的标题header@Kent,非常感谢您的帮助,除了“排序”还有其他选择吗。我在country字段中的实际输入文件在不同位置有一些特殊字符,如Cura‡ao和cygwin,显示排序错误:字符串比较失败:无效或不完整的多字节或宽字符排序:设置LC‡u ALL='C'以解决此问题。排序:比较的字符串为Cura‡ao@RomanPerekhrest保存标题并在结尾打印不会有问题。我知道op的主要问题是排序和选择前3行。我的答案可能不是开箱即用的解决方案,但我希望它为主要问题提供了一个解决方案。@AVN在启动排序/awk之前,您可以尝试更改本地设置(例如,更改为UTF-8)…您忘记了打印输出的标题header@Kent,非常感谢您的帮助,除了“排序”还有其他选择吗。我在country字段中的实际输入文件在不同位置具有一些特殊字符,例如Cura‡ao和cygwin,显示错误,如sort:string comparison failed:无效或不完整的多字节或宽字符排序:设置LC ALL='C'以解决问题。排序:比较的字符串是Cura‡ao@RomanPerekhrest保存标题并在结尾打印不会有问题。我知道op的主要问题是排序和选择前3行。我的答案可能不是开箱即用的解决方案,但提供了主要问题的解决方案,我希望。@AVN在启动排序/awk之前,您可以尝试更改您的本地设置(例如,更改为UTF-8…@Ed Morton,非常感谢您的帮助,实际输入文件包含44列,还希望填充所有其他字段信息。很抱歉,忘了提及该栏中没有任何详细信息question@AVN好吧,我不明白你为什么要告诉我,尽管上面的内容适用于任何数量的列。你看到问题了吗?@Ed Morton,明白了,在实际的输入文件中,“Amount”字段列的位置是22,之前我认为应该写sort-t,-s-k1,1n-k2,2-k3,3-k4,4-k5,5-k6,6等等-k22,22n etcNo,只需将排序字段的数量增加1,以说明第一个awk正在添加的额外前导字段。因此,如果原始输入文件中的排序字段为22,则排序命令的排序字段为23(并且您将添加-k1,1n,如图所示,以保护标题行相对于文件其余部分的相对顺序)。感谢Ed Morton@Ed Morton,非常感谢您的帮助,实际输入文件包含44列,也要填充所有其他字段信息。很抱歉,忘了提及该栏中没有任何详细信息question@AVN好吧,我不明白你为什么要告诉我,尽管上面的内容适用于任何数量的列。你看到问题了吗?@Ed Morton,明白了,在实际的输入文件中,“Amount”字段列的位置是22,之前我认为应该写sort-t,-s-k1,1n-k2,2-k3,3-k4,4-k5,5-k6,6等等-k22,22n etcNo,只需将排序字段的数量增加1,以说明第一个awk正在添加的额外前导字段。因此,如果原始输入文件中的排序字段是22,那么排序命令的排序字段将是23(并且您将添加-k1,1n,如图所示,以保护标题行相对于文件其余部分的相对顺序)。谢谢Ed Morton的可能重复
Country,Desc,Amount,Details
Abc,zzz,5,aaa
Abc,yyy,10,aaa
Abc,ttt,15,aaa
def,yyy,20,bbb
def,xxx,30,bbb
def,zzz,30,bbb
ghi,ttt,25,ccc
ghi,yyy,25,ccc
ghi,xxx,35,ccc
$ awk '{print (NR==1?1:2)","$0}' file |
  sort -t, -s -k1,1n -k2,2 -k4,4n |
  cut -d, -f2- |
  awk -F, 'cnt[$1]++<3'
Country,Desc,Amount,Details
Abc,zzz,5,aaa
Abc,yyy,10,aaa
Abc,ttt,15,aaa
def,yyy,20,bbb
def,xxx,30,bbb
def,zzz,30,bbb
ghi,ttt,25,ccc
ghi,yyy,25,ccc
ghi,xxx,35,ccc
{ head -1 file && tail -n +2 file | sort -t, -s -k1,1 -k3,3h; } | awk -F, 'cnt[$1]++<3'