Unix 省略条目的Join语句

Unix 省略条目的Join语句,unix,join,hidden-characters,Unix,Join,Hidden Characters,使用: Unix 2.6.18-194.el5 我遇到一个问题,这个join语句在匹配中忽略了值/索引。我发现这些值在11-90之间(大约350万个条目中),我试图寻找外来字符,但我可能忽略了一些东西(尝试使用cat-v查看隐藏字符) 以下是我正在使用的join语句(为了安全起见,仅简化了输出列): 文件1内容(前20个值): 一, 3. 7. 11 12 16 17 19 20 21 27 28 31 33 34 37 39 40 41 42 file2内容(前50个值,以便您可以查看其匹配位

使用: Unix 2.6.18-194.el5

我遇到一个问题,这个join语句在匹配中忽略了值/索引。我发现这些值在11-90之间(大约350万个条目中),我试图寻找外来字符,但我可能忽略了一些东西(尝试使用cat-v查看隐藏字符)

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

文件1内容(前20个值):

一, 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完全匹配;但是,同一文件与文件2不匹配

另一件奇怪的事情是,该文件有350万条记录,值为90时,它们又开始匹配。例如,FileJoin的输出如下所示(仅前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
    说明符中缺少了一个逗号。我把它改为
    -o1.1,2.1

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

    1|1
    3|3
    7|7
    
    我认为这是因为join假设按字母顺序排序,而您的输入文件看起来是按数字排序的

    join(1)的规则#1是确保您的输入被排序,就像join期望的那样

    当我通过sort运行两个输入文件,然后再次合并时,我得到了18行输出。(排序很容易,因为您加入了第一列;我不必到处乱搞排序的列说明符。)


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

    您是否使用sort-g对列进行排序?@fullern14:不,普通排序。join总是假定默认排序(不是数字排序或其他任何排序),因此一般来说,您也必须以这种方式对输入进行排序;但是,它仍然不会匹配第一个数据集“file1”中的所有值,这仍然是潜在的问题。文件1中列出的所有数字(总共20个)实际上都在第一列的文件2中,理论上它们都应该匹配。是否对两个文件进行排序?是的,两个文件都在排序。但即使在你的跑步中,如果你只找到18个值,你也会少出2个记录,对吗?对我来说,这是一个非常奇怪的现象,因为另一个数据集作为旁注运行得很好,我可以使用:grep-f file1New file2获取所有提取的值,其中file1New具有所有相同的值,但前面是一个^,最后是一个|。例如:^1 | ^3 | ^7 | ^11 |但是,在我正在运行此操作的大型文件上运行此操作将花费永远的时间
    1|1
    3|3
    7|7