linux - 根据unix中的两列对csv文件进行排序

标签 linux csv sorting unix awk

我是 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/

相关文章:

linux - 将目录结构的一部分复制到新位置

python - 删除先前的环境目录后,Conda 虚拟环境创建不完整

c++ - 对静态库中类变量的 undefined reference

csv - 获取 Haskell CSV 中的列并推断列类型

python - 当使用 pandas 在 csv 中满足条件时需要删除行并更新其他行

java - 如何在 Java 中对字符串的 ArrayList 进行排序?

linux - 为什么客户端在TCP握手过程中发送一个RST数据包?

mysql - 加载数据本地 infile - 选择忽略最后一列

linux - 不同顺序的多重排序

java - 如何按属性对对象数组列表进行排序?