使用: Unix的 2.6.18-194.el5
我遇到的问题是这个连接语句省略了匹配中的值/索引。我发现这些值介于11-90之间(大约350万条目中)并且我试图寻找外国字符,但我可能会忽略某些东西(尝试猫-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 |美国 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 |美国 35 |美国 36 |美国 37 |美国 38 |美国 39 |美国 40 |美国 41 |美国 42 |美国 43 |美国 44 |美国 45 |美国 46 |美国 47 |美国 48 |美国 49 |美国 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
我尝试过的其他事情是:
我认为可能存在一些我遗漏的隐藏值,或者file1中的11 - 90与file2中的11 - 90不等同吗?
我迷失在这里,非常感谢任何帮助。
答案 0 :(得分:0)
我试过了,我发现了几件事。
首先:这是次要的,但我认为你的-o
说明符中缺少一个逗号。我将其更改为-o 1.1,2.1
。
但是,在你发布的片段上运行它,我只得到三行输出:
1|1
3|3
7|7
我认为这是因为join假定按字母顺序排序,而输入文件看起来像是按数字排序。
join(1)的规则#1是确保你的输入被排序,并且加入期望它们的方式相同!
当我通过sort运行两个输入文件然后再次加入时,我得到了18行输出。 (排序很简单,因为你加入了第一列;我没有必要使用sort的列说明符。)
请注意,由于区域设置问题,排序并不总是按照您期望的方式排序。我倾向于设置LC_ALL = C以确保我得到了我习惯的老式行为。