使用"sort"命令按列优先级对CSV文件进行排序

Raf*_*gio 82 unix csv sorting sql-order-by

我有一个csv文件,我想按列优先级排序,比如"order by".例如:

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Run Code Online (Sandbox Code Playgroud)

如果这种情况是"选择"的结果,"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
Run Code Online (Sandbox Code Playgroud)

我想知道如何在Unix上使用"sort"命令获得相同的结果.

Cha*_*tin 135

sort --field-separator=';' --key=2,1,3
Run Code Online (Sandbox Code Playgroud)

  • 如果值是数字,那么您可能需要考虑使用`-n`选项,它将"根据字符串数值进行比较"或`-g`选项,它将"根据一般数值进行比较".数值的字符串比较将获得像"1,10,2,20"那样的数字.至少那些是我在CentOS上排序的选项.您应该在手册页中验证您的排序版本上的正确选项. (6认同)
  • @mrbolichi 符号 `--key={2,1,3}` 使用 bash 的大括号扩展 (4认同)
  • 我得到`sort:字段规范中的流浪字符:无效的字段规范'2,1,3' (3认同)
  • @MartinThoma已经很长时间了,但是我遇到了你的问题,我发现`sort --field-separator =';' --key = {2,1,3}`。从2016年4月开始在`GNU coreutils 8.4`中工作 (3认同)
  • 但是,`sort --field-separator =',-r -k3 -k1 -k2 source.csv> target.csv`对我有用。 (2认同)
  • 这对于列中包含字段分隔符的真实 csv 文件永远不起作用 (2认同)

Sam*_*ien 24

上面的查理答案在Cygwin(排序版本2.0,GNU textutils)上对我没有用,以下是:

sort -t"," -k2 -k1 -k1
Run Code Online (Sandbox Code Playgroud)

  • Cygwin有一个旧版本的排序.与往常一样,手册页是您的朋友. (3认同)
  • 我同意@CharlieMartin,您应该查看系统上的手册页.在CentOS上我用`sort --field-separator =';' -k2 -k1 -k3 test.csv` (2认同)

Mar*_*oma 23

假设您3;10;3unsorted.csv文件中有另一行.然后我猜你期望得到一个数字排序的结果:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3
Run Code Online (Sandbox Code Playgroud)

而不是按字母顺序排序的:

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1
Run Code Online (Sandbox Code Playgroud)

为此,您必须使用-n:

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv
Run Code Online (Sandbox Code Playgroud)

值得一提的是2,2必须使用.如果仅2使用,则将sort字符串从字段2的开头带到结尾.2,2确保只使用字段2.

  • 关于-k 2和-k 2,2之间差异的指针很重要!我在第一次阅读手册时忽略了这一点.谢谢. (6认同)