繁体   English   中英

加入声明省略条目

[英]Join Statement omitting entries

使用:Unix 2.6.18-194.el5

我遇到一个问题,该联接语句从匹配中省略了值/索引。 我发现值在11-90之间(在大约350万个条目中),并且我尝试查找外来字符,但是我可能忽略了某些内容(尝试使用cat -v来查看隐藏的字符)。

这是我正在使用的join语句(为安全起见,仅简化了输出列):

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

从我的初步测试看来,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不是相同的二进制等效项?

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

我尝试了一下,然后发现了几件事。

首先:这是次要的,但是我认为您在-o指示符中缺少逗号。 我将其更改为-o 1.1,2.1

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

1|1
3|3
7|7

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

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

当我对两个输入文件进行排序并再次加入时,我得到了18行输出。 (排序很容易,因为您要加入第一列;我不必弄乱sort的列说明符。)

请注意,由于区域设置的问题,如今,排序并不总是按照您期望的方式排序。 我倾向于设置LC_ALL = C,以确保得到我惯用的老式行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM