Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 对多列进行数字排序_Shell_Sorting - Fatal编程技术网

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选项之外没有其他方法。谢谢