我有一个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.4
2016
--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
提取顶部行之前为所有排序的行提供唯一性。