试图了解linux中的排序实用程序

时间:2015-12-07 13:25:16

标签: linux sorting csv gnu-sort

我有一个名为a.csv的文件。其中包含

100008,3
10000,3
100010,5
100010,4
10001,6
100021,7

运行此命令后sort -k1 -d -t "," a.csv

结果是

10000,3
100008,3
100010,4
100010,5
10001,6
100021,7

10001 should come first than 100010

而出乎意料

试图理解为什么这种情况很长时间都会发生。但无法得到任何答案。

$ sort --version
sort (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

5 个答案:

答案 0 :(得分:2)

其他一些回复假设这是一个数字排序与字典排序问题。它不是,因为即使按字母顺序排序,问题中给出的输出也是不正确的。

答案

要获得正确的排序,您需要将* { margin: 0; box-sizing: border-box; padding: 0; } html, body { min-height: 100vh; /* Minimum height is the full viewport */ } article { min-height: calc(100vh - 50px); /* Minimum height is the viewport height minus the footer */ } main { background-color:lightgray; } footer { background-color: green; height: 50px; } 更改为-k1

-k1,1

原因

$ sort -k1,1 -d -t "," a.csv 10000,3 100008,3 10001,6 100010,4 100010,5 100021,7 选项需要两个数字,即开始和结束字段进行排序(即-k,其中-ks,e是开头,s是结尾。默认情况下,结束字段是行的结尾。因此,e与完全不提供-k1选项相同。为了表明这一点,请比较:

-k

使用:

$ printf "1,a,1\n2,aa,2\n" | sort -k2 -t,
1,a,1
2,aa,2

第一个在$ printf "1~a~1\n2~aa~2\n" | sort -k2 -t~ 2~aa~2 1~a~1 之前排序a,1,而第二个排序aa,2之前aa~2排序,自ASCII,a~1&lt; ,&lt; a

因此,要获得所需的行为,我们需要对一个字段进行排序。在您的情况下,这意味着使用1作为开始和结束字段,因此您指定~。如果您使用-k1,1而不是-k2,2尝试上述两个示例,则在两种情况下都会得到相同(正确)的排序。

非常感谢来自coreutils邮件列表的Eric和Assaf指出这一点。

答案 1 :(得分:2)

你没有在排序中发现错误。您的使用错误是您使用了&#39; -k1&#39; (&#34;将键设置为第一个字段到行的末尾&#34;)而不是&#39; -k1,1&#39; (&#34;将密钥设置为仅使用第一个字段&#34;)。如果使用GNU排序, - debug选项将显示差异。只要密钥超出单个字段,分隔符就会包含在密钥中。

答案 2 :(得分:0)

按字母顺序排序,而不是数字排序,因此“,”在“0”之前,即更像字典

答案 3 :(得分:0)

-d选项适用于--dictionary-order

  

-d, - data-order       只考虑空白和字母数字字符

但我认为您想要使用-n--numeric-sort)代替:

  

-n, - 数字 - 排序       根据字符串数值

进行比较

因此,将命令更改为:

sort -k1 -n -t "," a.csv

http://man7.org/linux/man-pages/man1/sort.1.html

答案 4 :(得分:0)

排序是按字母顺序排列的,而非数字排序。在选项列表中将-d替换为-n以进行数字排序。