【问题标题】:Sorting csv file based on two columns in unix基于unix中的两列对csv文件进行排序
【发布时间】:2018-11-23 11:04:22
【问题描述】:

我是 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 进行排序的建议。

【问题讨论】:

    标签: linux csv sorting unix awk


    【解决方案1】:

    限制排序字段

    $ 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 个字段开始到末尾,根据最后一个字段的顺序,这似乎是您想要的。此外,您还想根据第二个字段以相反的顺序对行重新排序。

    注意。如果您的数字字段不是零填充,您可能需要添加 -n 选项来指示数字顺序而不是词法顺序。在这里没有区别。

    【讨论】:

    • 对不起,我的规范令人困惑。我基本上想要我的输出如上所示。
    • 您好,谢谢。当我尝试在在线 unix 终端进行测试时,这确实工作正常。但不幸的是,它在 SunOs 上的我的 unix 终端中不起作用。我怀疑这个命令是否不起作用,因为 SunOs!
    • 当我运行命令时,我只得到如下输出::( 603,02,0123456,1111,201806131115 603,20,0123456,1111,201806131115 603,02,0123456,1111,201806113 603,20,0123456,1111,201806131117 603,02,9876542,2222,201806131215 603,20,9876542,2222,201806131215
    【解决方案2】:

    Sort 将对 csv 和 txt 文件中的数据进行排序,它将在控制台上打印输出

    -t 表示列由 '|' 分隔, -k1 -k2 表示-它将按第 1 列和第 2 列对数据进行排序

    $ sort -t '|' -k1 -k2 <INPUT_FILE>
    

    要将结果存储在输出文件中,请使用以下命令

    $ sort -t '|' -k1 -k2 <INPUT_FILE> -o <OUTPUTFILE>
    

    如果您想忽略标题行,请使用以下命令

    (head -n1 INPUT_FILE && sort <(tail -n+2 INPUT_FILE)) > OUTPUT_FILE
    

    head -n1 INPUT_FILE 仅打印文件的第一行,即标题

    & 这种特殊的 tail 语法将您的文件从第二行直到 EOF。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多