使用排序和通讯的问题

使用排序和通讯的问题

我试图找到两个纯数据文件的交集,并从上一篇文章中发现它可以通过

comm -12 <(sort test1.list) < (sort test2.list)

在我看来,sort test1.list目的是按顺序对 test1.list 进行排序。为了了解sort工作原理,我尝试了sort以下文件 test1.list 作为sort test1.list > test2.list

100
-200
300
2
92
15
340

然而,事实证明 test2.list 是

100
15
2
-200
300
340
92

这个重新排序的列表让我对这种排序如何工作以及排序和通讯如何一起工作感到非常困惑。

答案1

根据comm手册,“在使用‘comm’之前,必须使用‘LC_COLLATE’语言环境指定的整理顺序对输入文件进行排序。”

sort手册:“除非另有说明,所有比较都使用‘LC_COLLATE’语言环境指定的字符整理序列。

因此,快速测试证实,预期的LC_COLLATE顺序comm是由sort的默认顺序(字典排序)提供的。

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

  • -d:字典顺序 - 忽略除空格和字母数字之外的任何内容。
  • -g:一般数字 - 字母,然后是负数,然后是正数。
  • -h:人类可读 - 负数、阿尔法、正数。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

答案2

只是为了充实凯文的全面且说明性的答案:如果您comm使用不区分大小写的标志 运行,comm -i则还必须不区分大小写地排序,例如sort -f

完整示例:

comm -i <(sort -i test1.list) <(sort -i test2.list)

否则,本机sort(无标志)将起作用。

答案3

sort -n filename您可以使用for sorting 并使用该命令进行排序comm

相关内容