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_COLLATE
d排序。只需说出答案中的错误就并非纯粹出于测试集之外的示例而已...没人问过正数排序。
当用于比较文件中的正整数而不是文本时,OP收到有关“ 文件未排序顺序 ” 的错误。因此,我们正在处理非十进制数字。comm
根据将-n
switch与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提出了需要进一步扩展的问题。总是很高兴能对我的工作进行审查:唯一能够使自己变得更好的方法就是,如果我们不断受到同行的挑战和挑战。