Answers:
comm需要按字典顺序排序(plain sort),而不是数字排序(sort -n)。例如,它需要以下顺序:
1
2000
300
不是以下命令:
1
300
2000
更正此问题,该问题将消失。对于更深奥的情况下comm的语言环境可能会比不同sort的语言环境,你可能需要运行sort,并comm与LC_COLLATE=C他们的环境中使用本地字节顺序。
sort -n
sort 有,并没有在-n开关和仅演示用的-n开关就可以实现正确的增加你承认为了在你自己的答案是必需的。
comm字面上需要LC_COLLATEd排序。只需说出答案中的错误就并非纯粹出于测试集之外的示例而已...没人问过正数排序。
当用于比较文件中的正整数而不是文本时,OP收到有关“ 文件未排序顺序 ” 的错误。因此,我们正在处理非十进制数字。comm
根据将-nswitch与sort提供给的结果进行排序的命令配合使用的情况comm,所返回的结果的顺序comm可能会非常不同:
Lexographic:将-n开关与sort一起使用将导致“正整数”以一系列递增的顺序排序。可以使用`s开关抑制“ 错误 ”comm--nocheck-order
字节顺序:有否使用的-n switch用sort。 LC_COLLATE确定顺序,该顺序甚至可能因locale在执行命令的主机上设置的方式而异。这是comm默认情况下的预期输入。LC_COLLATE可以在这里找到更多有关信息:Reference1和Reference2
错误是问题吗?
这取决于您要实现的目标。如您在以下示例中看到的,comm在比较带有或不 带有sort s-n开关的文件之后,返回相同的结果,尽管它们的顺序将根据是否-n switch与sort命令一起使用以上述方式变化。我本人则更喜欢按“字典顺序”排序的结果数,其数量会逐级增加。
但是,如果您不希望结果按“ 字典顺序”排序,则在对提供给比较的数据进行排序时,请勿使用该-n开关comm。
我们将比较comm带有和不带有-n开关的命令的结果。根据Kusalananda的要求,我增加了样本测试数据集的复杂性:
file1.txt:
40
110000
2200
6
33000
file2.txt:
2200
40
33000
6
440000
仅列出两个文件共有的数字
-n开关:comm -12 <(sort file1.txt) <(sort file2.txt)
2200
33000
40
6
结果:正确,但按未排序顺序返回
-n开关:comm -12 <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm: file 1 is not in sorted order
结果:正确,但以LEXOGRAPHIC排序顺序返回。该操作成功完成,并且返回与使用comm不带-n开关的结果相同的结果,但排序列表中。
仅列出每个文件唯一的数字:
-n开关:comm -3 <(sort file1.txt) <(sort file2.txt)
110000
440000
结果:正确-这些数字确实是每个文件专有的。
-n开关:comm -3 <(sort -n file1.txt) <(sort -n file2.txt)
110000
comm: file 1 is not in sorted order
440000
结果:正确,结果与comm不使用-n开关时相同,但是返回有关文件中未对正整数排序的错误。
使用comm`s --nocheck-order开关禁止显示错误消息。由于我们知道数字未在每个文件中排序,但是返回的结果comm -n是正确的,因此可以通过抑制它来安全地忽略该错误:
comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
110000
440000
返回给定的正整数返回排序时,错误“ 文件未排序 ” comm并不意味着使用-n开关返回的结果comm是错误的。确实,使用会comm -n按排序顺序返回整洁的正确!
感谢@ dhag,@ kusalananda @ChrisDown提出了需要进一步扩展的问题。总是很高兴能对我的工作进行审查:唯一能够使自己变得更好的方法就是,如果我们不断受到同行的挑战和挑战。