按组和列对行进行排序

时间:2016-01-03 20:58:41

标签: bash sorting unix

我有一个用分号分隔的csv文件。其中包含如下所示的行。我需要按第一列和第三列对其进行排序,尊重由第一列的值定义的行组。

booke;book;2
booke;booke;1
booke;bookede;6
booke;bookedes;8
booke;booker;4
booke;bookes;7
booke;booket;3
booking;booking;1
booking;bookingen;2
booking;bookingens;3
booking;bookinger;7
booking;bookingerne;5
booking;bookingernes;6
booking;bookingers;8
booking;bookings;4

预期产出:

booke;booke;1
booke;book;2
booke;booket;3
booke;booker;4
booke;bookede;6
booke;bookes;7
booke;bookedes;8
booking;booking;1
booking;bookingen;2
booking;bookingens;3
booking;bookings;4
booking;bookingerne;5
booking;bookingernes;6
booking;bookinger;7
booking;bookingers;8

我用sort -t; -k3,3n -k1,1尝试了它,但它按第三列整理。

1 个答案:

答案 0 :(得分:2)

如何以管道方式使用两种类型:

sort -t ';' -k 3,3n | sort -t ';' -k 1,1 -s

第二个参数中的-s是启用稳定排序所必需的。否则它可能会破坏之前的(第三列)排序。

编辑:但是@BenjaminW。在his comment中指出,您可以使用多个-k标志,您只能以错误的方式指定它们。通过执行排序:

sort -t ';' -k 1,1 -k 3,3n

第一列是主要的排序列,第三列是次要的。