使用:
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|美国
35|美国
36|美国
37|美国
38|美国
39|美国
40|美国
41|美国
42|美国
43|美国
44|美国
45|美国
46|美国
47|美国
48|美国
49|美国
50|美国
从我最初的测试来看,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
我尝试过的其他事情是:
- 使用vi手动输入新行11(仍然与join语句不匹配)
- 将代码复制到记事本中,删除 vi 中的行,然后将它们复制回来(相同的结果,没有匹配的 11-90)
- 删除第 11-90 行,看看问题是否转移到第 90-170 行并且没有转移
我认为可能缺少一些隐藏值,或者 file1 中的 11 - 90 与 file2 中的 11 - 90 不是相同的二进制等价物?
我在这里迷路了,任何帮助将不胜感激。
我尝试了一下,发现了一些事情。
首先:这是次要的,但我认为你在你的-o
说明符。我把它改为-o 1.1,2.1
.
但是,然后,仅在您发布的片段上运行它,我只得到三行输出:
1|1
3|3
7|7
我认为这是因为 join 假定按字母顺序排序,而您的输入文件看起来像是按数字排序的。
join(1) 的规则 #1 是确保您的输入已排序,并且与 join 期望的方式相同!
当我通过排序运行两个输入文件然后再次连接时,我得到了 18 行输出。 (排序很容易,因为您要加入第一列;我不必乱搞排序的列说明符。)
请注意,如今,由于区域设置问题,排序并不总是按照您期望的方式进行排序。我倾向于设置 LC_ALL=C 以确保我得到我习惯的老式行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)