对多个字段进行排序命令

对多个字段进行排序命令

我有一个包含内容的文件

192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23

当我给

$ sort -h -t. -k3,4 sort_test.txt 
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56

无法理解为什么 10.1.1.23 出现在 10.1.1.3 之前。我想,由于使用两个字段进行比较,因此当存在平局时使用第二个字段,并且它应该像正常排序一样工作。

答案1

这排序.23.3

$ sort -h -t. -k3,3 -k4,4 sort_test.txt 
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56

答案2

在这种情况下最好使用-n替代-h选项。但最主要的是.我认为某些版本的sort操作 -t 参数可能会扩展为正则表达式,所以为了确保我会提出逃跑.

sort -nt\. -k3,4 sort_test.txt 

答案3

理解为什么排序表现得“奇怪”

因为您是从键 3 到键 4 排序,所以排序将忽略所有其他字段

 sort -h -t. -k3,4 sort_test.txt

将导致

10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56

从结果中提取键 3 和 4 将解释为什么对192.168.1.3上面的位置进行排序10.1.1.3

1.1
1.2
1.2------>192.168.1.2
1.23------> 10.1.1.23
1.3------>10.1.1.3
1.3
1.4
1.43
1.56

因此,我们明白了为什么排序行为应该如此的原因......从键 1 到 4 排序将得到正确的结果。

sort -h -t. -k1,4 sort_test.txt

答案4

-n-h激活数字比较;在这种情况下,当我们说“ k3,4”时,k3将得到一个浮点数(k3 = 1.23 < 1.3)和k4 =“”。

使用“ -V”,行为更好:版本号 1.2 < 1.3 < 1.23。

sort  -t. -k3,4V

应用于

192.168.10.3
192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23
192.168.9.3

回报

10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56
192.168.9.3
192.168.10.3

使用以下命令将获得相同的结果:

sort -t. -k3V
sort -V -t. -k3

相关内容