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