加入声明省略条目

Join Statement omitting entries

使用: Unix 2.6.18-194.el5

我遇到一个问题,这个连接语句在匹配中省略了 values/indexes。我发现值在 11-90 之间(大约 350 万个条目),我试图寻找外来字符,但我可能忽略了一些东西(尝试 cat -v 查看隐藏字符)。

这是我正在使用的连接语句(为了安全只简化了输出列):

join -t "|" -j 1 -o 1.1 2.1 file1 file2> fileJoined

file1 内容(前 20 个值):

1 3 7 11 12 16 17 19 20 21 27 28 31 33 34 37 39 40 41 42

file2 内容(前 50 个值,以便您可以看到匹配的位置):

1|US 2|US 3|US 4|US 5|US 6|US 7|US 8|US 9|US 10|US 11|US 12|US 13|US 14|US 15|US 16|US 17|US 18|US 19|US 20|US 21|US 22|US 23|US 24|US 25|US 26|US 27|US 28|US 29|US 30|US 31|US 32|US 33|US 34|US 35|US 36|US 37|US 38|US 39|US 40|US 41|US 42|US 43|US 44|US 45|US 46|US 47|US 48|US 49|US 50|US

从我最初的测试来看,文件 2 似乎是罪魁祸首。因为当我创建一个值为 1-100 的新文件时,我能够使连接语句与 file1 完全匹配;但是同一个文件不会与 file2 匹配。

另一个奇怪的事情是文件有 350 万条记录,在值 90 时它们再次开始匹配。例如,fileJoined 的输出如下所示(仅前 20 个值):

1|1 3|3 7|7 90|90 91|91 92|92 93|93 95|95 96|96 97|97 98|98 99|99 106|106 109|109 111|111 112|112 115|115 116|116 117|117 118|118

我尝试过的其他事情是:

  1. 使用 vi 手动输入新的第 11 行(在 join 语句上仍然不匹配)
  2. 将代码复制到记事本中,删除vi中的行,然后将它们复制回来(结果相同,没有匹配11-90)
  3. 删除第 11-90 行以查看问题是否转移到 90-170 并且它没有转移

我认为我可能遗漏了一些隐藏值,或者文件 1 中的 11 - 90 与文件 2 中的 11 - 90 不是相同的二进制等价物?

我在这里迷路了,任何帮助将不胜感激。

我试过了,我注意到了一些事情。

首先:这是次要的,但我认为您在 -o 说明符中缺少一个逗号。我把它改成 -o 1.1,2.1.

但是 运行 就你发布的片段而言,我只得到三行输出:

1|1
3|3
7|7

我认为这是因为 join 假定按字母排序,而您的输入文件看起来像是按数字排序。

join(1) 的第 1 条规则是确保您的输入已排序,并且与 join 期望的排序方式相同!

当我运行 将两个输入文件通过排序然后再次连接时,我得到了 18 行输出。 (排序很简单,因为您要加入第一列;我不必费心处理排序的列说明符。)

请注意,由于区域设置问题,如今排序并不总是按照您期望的方式排序。我倾向于设置 LC_ALL=C 以确保我得到我习惯的老式行为。