我有一个名为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.
答案 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
答案 4 :(得分:0)
排序是按字母顺序排列的,而非数字排序。在选项列表中将-d替换为-n以进行数字排序。