我是 unix shell 脚本的初学者。我正在尝试根据两列对 csv 文件进行排序。
我的文件如下所示:
sh-4.4$ cat test.csv
603,02,0123456,1111,201806131115
603,20,0123456,1111,201806131115
603,02,9876542,2222,201806131215
603,20,9876542,2222,201806131215
603,02,0123456,1111,201806131117
603,20,0123456,1111,201806131117
我想按第 3 列分组,第 2 列也应按如下所示排序:
603,20,0123456,1111,201806131115
603,02,0123456,1111,201806131115
603,20,0123456,1111,201806131117
603,02,0123456,1111,201806131117
603,20,9876542,2222,201806131215
603,02,9876542,2222,201806131215
我尝试执行 sort -t',' -k3 -k2 test.csv
。这会对第 3 列进行分组,但不会对第 2 列进行排序。其输出如下所示。
603,02,0123456,1111,201806131115
603,20,0123456,1111,201806131115
603,02,0123456,1111,201806131117
603,20,0123456,1111,201806131117
603,02,9876542,2222,201806131215
603,20,9876542,2222,201806131215
我还尝试了 sort -t',' -k3 -rk2 test.csv
。然而,这会按照我的需要对第 2 列进行排序,但第 3 列未按我的预期进行排序。它的输出如下所示。
603,20,9876542,2222,201806131215
603,02,9876542,2222,201806131215
603,20,0123456,1111,201806131117
603,02,0123456,1111,201806131117
603,20,0123456,1111,201806131115
603,02,0123456,1111,201806131115
非常感谢对此的任何帮助。也欢迎提出使用 awk 进行排序的建议。
最佳答案
限制排序字段
$ sort -t, -k3,3 -k2,2 file
应该做。
但请注意,您想要的输出与您描述的规范不符。你会得到
603,02,0123456,1111,201806131115
603,02,0123456,1111,201806131117
603,20,0123456,1111,201806131115
603,20,0123456,1111,201806131117
603,02,9876542,2222,201806131215
603,20,9876542,2222,201806131215
仅按第三个字段分组并按第二个字段排序。
也许这就是你想要的?
$ sort -t, -k3 -k2,2r file
603,20,0123456,1111,201806131115
603,02,0123456,1111,201806131115
603,20,0123456,1111,201806131117
603,02,0123456,1111,201806131117
603,20,9876542,2222,201806131215
603,02,9876542,2222,201806131215
请注意,-k3
表示从第 3 个字段开始到最后,根据最后字段的顺序,这似乎是您想要的。此外,您希望根据第二个字段以相反的顺序对行进行重新排序。
NB. 如果您的数字字段没有用零填充,您可能需要添加 -n
选项来指示数字顺序而不是词汇顺序。在这里它没有什么区别。
关于linux - 根据unix中的两列对csv文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844442/