我有一个包含内容的文件
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