使用“ Sort”命令按多列对 CSV 文件进行排序

我有一个类似 CSV 的文件,我想按列优先级对它进行排序,比如 SQL 中的“ ORDERBY”。例如,给定下列行,

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1

如果“ ORDERBY”是 column2, column1, column3,结果将是:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1

我想知道如何使用 Unix 上的 sort命令得到相同的结果。

132839 次浏览

You need to use two options for the sort command:

  • --field-separator(或 -t)
  • --key=<start,end>(或 -k) ,以指定排序键,即根据哪个列范围(从开始到结束索引)进行排序。因为您希望对3列进行排序,所以需要为 2,21,13,3列指定3次 -k

把它们放在一起,

sort -t ';' -k 2,2 -k 1,1 -k 3,3

请注意,sort无法处理字段包含分隔符的情况,即使它被转义或引用。

Also note: this is an old question, which belongs on UNIX.SE, and was also asked there a year later.


旧的答案: 根据系统的 sort版本,下面的方法也可能有效:

sort --field-separator=';' --key=2,1,3

或者,你可能会得到“野外规格的流浪人物”。

According to the 分类手册, if you don't specify the end column of the sort key, it defaults to the end of the line.

Charlie 上面的回答在 Cygwin (sort version 2.0,GNU textutils)上对我不起作用,下面的回答起作用了:

sort -t"," -k2 -k1 -k1

Suppose you have another row 3;10;3 in your unsorted.csv file. Then I guess you expect a numerically sorted result:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3

and not an alphabetically sorted one:

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1

To get that, you have to use -n:

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv

值得一提的是,必须使用 2,2。如果只使用 2,那么 sort将字符串从字段2的开始到结束。2,2确保只使用字段 2

..如果有人遵循“ sort”的解决方案,但是现在想要得到更多的每行唯一条目(也就是最多的 X 个唯一条目) ,一旦你使用“ sort”对文件进行排序,你可以使用我在这里创建的一个小应用程序:

Https://github.com/danieliversen/miscstuff/blob/master/scripts/findtopuniques.java