Shell 对多列进行数字排序
我一直想知道当根据数值对多个列进行排序时,Shell 对多列进行数字排序,shell,sorting,Shell,Sorting,我一直想知道当根据数值对多个列进行排序时,sort是如何工作的。例如: echo -e " 2 3 \n 1 2 \n 2 10" | sort -n 产生: 1 2 2 10 2 3 sort-g也是如此。如果我还想对第二列进行数字排序,我提出的唯一解决方案是: echo -e " 2 3 \n 1 2 \n 2 10" | sort -k1n -k2n 它产生所需的输出: 1 2 2 3 2 10 有人可以解释这种行为,并告诉我们是否存在更简单的解决方案?更简单(不需要开头的-k1n
sort
是如何工作的。例如:
echo -e " 2 3 \n 1 2 \n 2 10" | sort -n
产生:
1 2
2 10
2 3
sort-g
也是如此。如果我还想对第二列进行数字排序,我提出的唯一解决方案是:
echo -e " 2 3 \n 1 2 \n 2 10" | sort -k1n -k2n
它产生所需的输出:
1 2
2 3
2 10
有人可以解释这种行为,并告诉我们是否存在更简单的解决方案?更简单(不需要开头的-k1n
),但不需要太多:
echo -e " 2 3 \n 1 2 \n 2 10" | sort -k2n
输出:
1 2
2 3
2 10
更简单,(不需要领先的-k1n
),但不需要太多:
echo -e " 2 3 \n 1 2 \n 2 10" | sort -k2n
输出:
1 2
2 3
2 10
的POSIX规范说明:
-n
将排序键限制为初始数字字符串,该字符串由可选的
字符、可选的减号和零位或多位数字组成,这些数字带有可选的基数字符和千位分隔符(如当前区域设置中定义的),这些数字应按算术值排序。空数字串应视为零。前导零和零上的符号不得影响订购
这与说-k1n,1
基本相同。如果要按多列数字排序,则必须这样说:
sort -k1n,1 -k2n,2 …
请注意不要在逗号后省略“field end”。的POSIX规范规定:
-n
将排序键限制为初始数字字符串,该字符串由可选的
字符、可选的减号和零位或多位数字组成,这些数字带有可选的基数字符和千位分隔符(如当前区域设置中定义的),这些数字应按算术值排序。空数字串应视为零。前导零和零上的符号不得影响订购
这与说-k1n,1
基本相同。如果要按多列数字排序,则必须这样说:
sort -k1n,1 -k2n,2 …
请小心省略逗号后的“字段结束”。“
-g
进行数字排序,将每行的前缀转换为长双精度浮点数。”“-g
进行数字排序,将每行的前缀转换为长双精度浮点数。”只对一列进行数字排序。问题是如何对两列进行数字排序。它真的没有回答这个问题。@JonathanLeffler,如果问题按字面解释,OP的输入似乎与问题模糊匹配。为了消除这种模糊性,今天早上我在考虑什么是最短和最好的两列输入,以便为以下四个选项生成四个不同的sort
输出:1<代码>-k1n2<代码>-k2n3<代码>-k1n-k2n4<代码>-k2n-k1n。从来没有过“思考”阶段。。。但是还没有找到一个2x3集可以工作……这是错误的:只是碰巧第一列排序正确。如果您尝试第二个示例echo-e“10 3\n 1 2\n 2 10”| sort-k2n
,您会发现在第一列中,值10放在2之前。@WolfNZO,谢谢,我在发布答案之前就知道了这一点。我们的不同之处在于,假定OP一定知道他想要什么。您假设OP希望对两列进行排序(毕竟,他是这么说的),但考虑到输入数据的模糊性,我认为有更多的怀疑空间。在为排序
找到适当的明确输入数据时,请参见。这只对一列进行数字排序。问题是如何对两列进行数字排序。它真的没有回答这个问题。@JonathanLeffler,如果问题按字面解释,OP的输入似乎与问题模糊匹配。为了消除这种模糊性,今天早上我在考虑什么是最短和最好的两列输入,以便为以下四个选项生成四个不同的sort
输出:1<代码>-k1n2<代码>-k2n3<代码>-k1n-k2n4<代码>-k2n-k1n。从来没有过“思考”阶段。。。但是还没有找到一个2x3集可以工作……这是错误的:只是碰巧第一列排序正确。如果您尝试第二个示例echo-e“10 3\n 1 2\n 2 10”| sort-k2n
,您会发现在第一列中,值10放在2之前。@WolfNZO,谢谢,我在发布答案之前就知道了这一点。我们的不同之处在于,假定OP一定知道他想要什么。您假设OP希望对两列进行排序(毕竟,他是这么说的),但考虑到输入数据的模糊性,我认为有更多的怀疑空间。在为排序找到适当的明确输入数据时,请参见。好的,因此基本上除了为每列指定-n选项之外没有其他方法。ThanksOk,所以基本上除了为每个列指定-n选项之外没有其他方法。谢谢