join声明省略条目

使用:Unix 2.6.18-194.el5

我遇到了一个问题,这个连接语句省略了匹配的值/索引。 我发现这些值在11-90之间(大约有350万条logging),我试图寻找外来字符,但是我可能忽略了一些东西(试图用猫-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 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

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

另一个奇怪的是,该文件是350万条logging长,价值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手动input一个新的行11(仍不匹配连接语句)
  2. 将代码复制到记事本中,删除vi中的行,然后将其复制回来(相同的结果,不匹配11-90)
  3. 删除行11-90,看看问题是否转移到90-170,它不会转移

我认为可能存在一些隐藏的值,或者file1中的11 – 90与file2中的11 – 90不是相同的二进制等价物?

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

我试了一下,发现了一些东西。

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

但是,然后,运行它只是你张贴的片段,我只有三行输出:

 1|1 3|3 7|7 

我认为这是因为连接假定按字母排序,而你的输入文件看起来像他们在数字上排序。

连接(1)的规则#1是确保你的输入是排序的,并以同样的方式连接期望他们!

当我通过排序运行两个输入文件,然后再次加入,我有18行的输出。 (排序很简单,因为你正在加入第一列;我不需要在sort的列说明符中弄脏。)

请注意,由于语言环境问题,现在排序并不总是按照您期望的方式排序。 我倾向于设置LC_ALL = C,以确保我已经习惯了老式的行为。