0

使用:Unix 2.6.18-194.el5

我遇到了这个连接语句从匹配中省略值/索引的问题。我发现这些值在 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|美国 2|美国 3|美国 4|美国 5|美国 6|美国 7|美国 8|美国 9|美国 10|美国 11|美国 12|美国 13|美国 14|美国 15|美国 16|美国 17|美国 18|美国 19|美国 20|美国 21|美国 22|美国 23|美国 24|美国 25|美国 26|美国 27|美国 28|美国 29|美国 30|美国 31|美国 32|美国 33|美国 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

从我最初的测试来看,file2 似乎是罪魁祸首。因为当我创建一个值为 1-100 的新文件时,我能够让 join 语句与 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 并且它没有转移

我认为我可能缺少一些隐藏的值,或者 file1 中的 11 - 90 与 file2 中的 11 - 90 不是同一个二进制等效项?

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

4

1 回答 1

0

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

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

但是,仅在您发布的片段上运行它,我只得到三行输出:

1|1
3|3
7|7

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

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

当我通过排序运行两个输入文件然后再次加入时,我得到了 18 行输出。(排序很容易,因为您要加入第一列;我不必乱用排序的列说明符。)

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

于 2015-06-17T17:03:35.050 回答