加入声明省略条目
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
我尝试过的其他事情是:
- 使用 vi 手动输入新的第 11 行(在 join 语句上仍然不匹配)
- 将代码复制到记事本中,删除vi中的行,然后将它们复制回来(结果相同,没有匹配11-90)
- 删除第 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 以确保我得到我习惯的老式行为。
使用: 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
我尝试过的其他事情是:
- 使用 vi 手动输入新的第 11 行(在 join 语句上仍然不匹配)
- 将代码复制到记事本中,删除vi中的行,然后将它们复制回来(结果相同,没有匹配11-90)
- 删除第 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 以确保我得到我习惯的老式行为。