use*_*609 6 linux shell sort comm
我试图找到两个纯数据文件的交集,从之前的帖子中发现可以通过
comm -12 <(sort test1.list) < (sort test2.list)
Run Code Online (Sandbox Code Playgroud)
在我看来,sort test1.list目的是按顺序对 test1.list 进行排序。为了了解sort工作原理,我尝试sort将以下文件 test1.list 作为sort test1.list > test2.list
100
-200
300
2
92
15
340
Run Code Online (Sandbox Code Playgroud)
然而,事实证明 test2.list 是
100
15
2
-200
300
340
92
Run Code Online (Sandbox Code Playgroud)
这个重新排序的列表让我很困惑这种排序是如何工作的,以及 sort 和 comm 是如何一起工作的。
Kev*_*vin 14
根据comm手册,“在使用 `comm' 之前,必须使用由 `LC_COLLATE' 语言环境指定的整理顺序对输入文件进行排序。”
和sort手册:“除非另有说明,所有比较都使用由‘LC_COLLATE’语言环境指定的字符整理序列。
因此,快速测试证实,期望的LC_COLLATE顺序comm由sort的默认顺序字典排序提供。
sort 可以以多种方式对文件进行排序:
-d: 字典顺序 - 忽略空格和字母数字以外的任何内容。-g: 一般数字 - 字母,然后是负数,然后是正数。-h: 人类可读 - 负、alpha、正。 n < nk = nK < nM < nG-n: 数字 - 负数、alpha、正数。k、M、G等并不特殊。-V:版本 - 正、大写、低、负。 1 < 1.2 < 1.10-f: 不区分大小写。-R: 随机 - 随机输入。-r:反向 - 通常与其中之一一起使用 dghnV当然,还有其他选项,但这些是您可能会看到或需要的选项。
您的测试表明默认排序顺序可能是-d字典顺序。
d | g | h | n | V
------+-------+-------+-------+-------
1 | a | -1G | -10 | 1
-1 | A | -1k | -5 | 1G
10 | z | -10 | -1 | 1g
-10 | Z | -5 | -1g | 1k
1.10| -10 | -1 | -1G | 1.2
1.2 | -5 | -1g | -1k | 1.10
1g | -1 | a | a | 5
1G | -1g | A | A | 10
-1g | -1G | z | z | A
-1G | -1k | Z | Z | Z
1k | 1 | 1 | 1 | a
-1k | 1g | 1g | 1g | z
5 | 1G | 1.10 | 1G | -1
-5 | 1k | 1.2 | 1k | -1G
a | 1.10 | 5 | 1.10 | -1g
A | 1.2 | 10 | 1.2 | -1k
z | 5 | 1k | 5 | -5
Z | 10 | 1G | 10 | -10
Run Code Online (Sandbox Code Playgroud)