linux按数字顺序排序多个分隔符

时间:2016-03-15 10:55:39

标签: linux

我按第二列排序数据,但它们不是我的预期。

0:1, 0:0,
0:2, 0:0,
1:1, 0:1,
1:2, 0:1,
0:11, 0:10,
0:12, 0:10, 
0:12, 0:11,
0:13, 0:11,
... (omit text) ...
1:192, 0:192,
2:192, 0:192,
0:3, 0:2,
0:4, 0:2,
... (omit text) ...
11:63, 9:63,
12:63, 9:63,
10:10, 9:7,
10:7, 9:7,
6:10, 9:7,
6:8, 9:7, 
...

使用sort -t',' -k2,2 text.txt对数据进行排序。我想在第二列以数字方式对它们进行排序,但0:3, 0:2跟在2:192, 0:192之后。此外,第一列未按数字顺序排序,因为10:7, 9:7,跟随10:10, 9:7

我想先按第二列,然后是第一列,以数字方式对数据进行排序。在第二列中,第一个数字位于第二个数字之前,例如2:192, 0:192后跟11:63, 9:63。第一列也是如此。我可以使用哪种命令来获得如下所示的结果?

0:1, 0:0,
0:2, 0:0,
1:1, 0:1,
1:2, 0:1,
0:3, 0:2,
0:4, 0:2,
0:11, 0:10,
0:12, 0:10, 
0:12, 0:11,
0:13, 0:11,
... (omit text) ...
1:192, 0:192,
2:192, 0:192,
... (omit text) ...
6:8, 9:7,
6:10, 9:7, 
10:7, 9:7,
10:10, 9:7,
11:63, 9:63,
12:63, 9:63,
...

1 个答案:

答案 0 :(得分:2)

首先,将冒号转换为逗号,使其具有一个可以指定排序的分隔符。

tr : ,

然后,按数字排序四列(注意n' s)

sort -t, -k3,3n -k4,4n -k1,1n -k2,2n

最后,将逗号后面没有空格转换回冒号:

sed 's/,\([^ ]\)/:\1/g'

或者,作为一个管道:

tr : , < input \
| sort -t, -k3,3n -k4,4n -k1,1n -k2,2n \
| sed 's/,\([^ ]\)/:\1/g'