基于unix中的两列对csv文件进行排序

时间:2018-06-13 19:00:38

标签: 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进行排序的建议。

2 个答案:

答案 0 :(得分: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个字段开始到结尾,根据最后字段的顺序,这似乎是您想要的。此外,您希望以相反的顺序基于第二个字段对行重新排序。

NB。如果你的数字字段不是零填充,你可能想要添加-n选项表示数字排序而不是词法排序。这里没有什么区别。

答案 1 :(得分:0)

排序将对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。