我有一个csv文件,我想按列优先级对其进行排序,例如“ order by”。例如:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
如果这种情况是“选择”的结果,则“ order by”将如下所示:order by column2,column1,column3-结果将是:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
我想知道如何在Unix上使用“ sort”命令获得相同的结果。
Answers:
sort --field-separator=';' --key=2,1,3
-n“根据字符串数值比较”的-g选项或“根据通用数值比较”的选项。数值的字符串比较将获得数字顺序,如1,10,2,20。至少这些是我在CentOS上的版本上可用的选项。您应该在手册页上确认排序版本上的正确选项。
sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv为我工作。
sort --field-separator=';' --key={2,1,3}。这工作于GNU coreutils 8.42016
--key={2,1,3}使用bash的括号扩展
假设你有另一行3;10;3中的unsorted.csv文件。然后,我猜您期望得到一个数字排序的结果:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3
而不是按字母顺序排序的:
2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1
为此,您必须使用-n:
sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv
值得一提的是2,2必须使用。如果仅2使用,则将sort字符串从字段2的开头到结尾。2,2确保仅使用字段2。
3;10;3,3:10:5,3:10;2,3;10;3在源文件中的顺序,并在使用只是 -k 2,2它似乎排序列2和3的手册页说"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."。就我而言,较早的键(值= 10)确实比较相等,但是,我没有-k多次指定。我不确定这是否可靠,还是与我的系统(mac)有关。最终,只要基本排序正确,就没有关系。
-s稳定的排序方法,它忽略了等号键,根据男人的说法,这显然更快。
上面查理的答案在Cygwin(排序版本2.0,GNU textutils)上对我不起作用,以下代码对我有效:
sort -t"," -k2 -k1 -k1
sort --field-separator=';' -k2 -k1 -k3 test.csv
..并且如果有人遵循“排序”解决方案,但现在希望获得的不仅仅是每行唯一的唯一条目(即,唯一条目的前X个),那么使用“排序”对文件进行排序后,就可以使用我在这里创建的一个小应用程序:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
cat unsorted-file | sort | uniq | head -X-when X是您希望输出的第一行的数量。
uniq在sort和之间有一个管道顺序的命令,该命令在head提取顶部行之前为所有排序的行提供唯一性。