使用 sort 和 comm 的问题

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顺序commsort的默认顺序字典排序提供。

sort 可以以多种方式对文件进行排序:

  • -d: 字典顺序 - 忽略空格和字母数字以外的任何内容。
  • -g: 一般数字 - 字母,然后是负数,然后是正数。
  • -h: 人类可读 - 负、alpha、正。 n < nk = nK < nM < nG
  • -n: 数字 - 负数、alpha、正数。kMG等并不特殊。
  • -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)