加入语句省略条目

时间:2015-06-17 14:11:32

标签: unix join hidden-characters

使用: 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

我尝试过的其他事情是:

  1. 使用vi手动输入新行11(在连接语句中仍然不匹配)
  2. 将代码复制到记事本中,删除vi中的行,然后将其复制回来(结果相同,不匹配11-90)
  3. 删除第11-90行以查看问题是否转移到90-170并且它没有移位
  4. 我认为可能存在一些我遗漏的隐藏值,或者file1中的11 - 90与file2中的11 - 90不等同吗?

    我迷失在这里,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我试过了,我发现了几件事。

首先:这是次要的,但我认为你的-o说明符中缺少一个逗号。我将其更改为-o 1.1,2.1

但是,在你发布的片段上运行它,我只得到三行输出:

1|1
3|3
7|7

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

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

当我通过sort运行两个输入文件然后再次加入时,我得到了18行输出。 (排序很简单,因为你加入了第一列;我没有必要使用sort的列说明符。)

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