UNIX完全外部联接会创建重复的条目项,尽管顺序正确?会不会是那些不成对的东西造成了混乱?

UNIX完全外部联接会创建重复的条目项,尽管顺序正确?会不会是那些不成对的东西造成了混乱?,unix,join,left-join,bioinformatics,outer-join,Unix,Join,Left Join,Bioinformatics,Outer Join,我有两个文件,我想根据它们的第一列连接它们 它们是经过排序的,并且并非FILE1中第一列中的所有值都在FILE2中,反之亦然 FILE1.TXT看起来像这样,只是大约有15k行: snRNA:7SK 1037 snRNA:U11 144 snRNA:U1:21D 348.293 snRNA:U12:73B 16 snRNA:U1:82Eb 2.14286 snRNA:U1:95Ca 348.293 snRNA:U1:95Cb 351.96 snRNA:U1:95Cc

我有两个文件,我想根据它们的第一列连接它们

它们是经过排序的,并且并非FILE1中第一列中的所有值都在FILE2中,反之亦然

FILE1.TXT看起来像这样,只是大约有15k行:

snRNA:7SK   1037
snRNA:U11   144
snRNA:U1:21D    348.293
snRNA:U12:73B   16
snRNA:U1:82Eb   2.14286
snRNA:U1:95Ca   348.293
snRNA:U1:95Cb   351.96
snRNA:U1:95Cc   35.5095
snRNA:U2:14B    447.35
snRNA:U2:34ABa  459.75
snRNA:U2:34ABb  513.25
snRNA:U2:34ABc  509
snRNA:U2:38ABa  443.65
snRNA:U4:38AB   155
snRNA:U4:39B    611.833
snRNA:U4atac:82E    152.5
snRNA:U5:14B    1
snRNA:U5:23D    2.5
snRNA:U5:34A    11
snRNA:U5:38ABb  2.5
snRNA:U5:63BC   44
snRNA:U6:96Aa   18
snRNA:U6:96Ab   9.5
snRNA:U6:96Ac   8.5
snRNA:U7    4
snRNA:U8    8
FILE2.TXT如下所示,它也是~15K行:

snRNA:7SK   1259
snRNA:U11   33
snRNA:U1:21D    1480.57
snRNA:U12:73B   4
snRNA:U1:82Eb   10.2
snRNA:U1:95Ca   1480.57
snRNA:U1:95Cb   1484.03
snRNA:U1:95Cc   114.633
snRNA:U2:14B    4678.89
snRNA:U2:34ABa  4789.93
snRNA:U2:34ABb  5292.22
snRNA:U2:34ABc  5273.23
snRNA:U2:38ABa  4557.88
snRNA:U2:38ABb  3.75
snRNA:U4:38AB   405
snRNA:U4:39B    1503.5
snRNA:U4atac:82E    548
snRNA:U5:14B    25
snRNA:U5:23D    19
snRNA:U5:34A    32
snRNA:U5:38ABb  4
snRNA:U5:63BC   742
snRNA:U6:96Aa   39.5
snRNA:U6:96Ab   1
snRNA:U6:96Ac   1
snRNA:U7    11
如您所见,FILE1中缺少FILE2中的元素(snRNA:U5:38ABb),FILE2中缺少FILE1中的元素。在整个文件中,无论是在两个方向还是多次,都是这样

我写命令如下:

join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t '        ' 
FILE1.TXT FILE2.TXT
>JOIN_FILE.TXT
如果我仅使用从每个文件粘贴的20行左右的行来尝试该命令,它将正常工作

但是当我在整个文件上运行它时,输出非常糟糕,我不明白为什么。这两个文件都是使用排序-k1,1进行排序的,因此即使1中的某些行不在2中,反之亦然,它们的顺序也是相同的

我得到的是一个项目的重复条目,例如:(同样,我只显示输出文件的一小部分…)

其中,本质上所有内容都已复制,其中一行表示文件1中的值,另一行表示文件2中的值。这可能是因为文件之间的累积差异(即,在这些特定条目之前的所有非成对条目?) 这种对输出的加扰会在整个文件中运行

我做错了什么?我是否没有指定两个文件中的条目并不总是匹配

有什么办法解决这个问题吗

非常感谢! 卡门

编辑:

下面是每个文件的前15行,以表明两者的顺序相同,但情况开始有所不同,因为FILE1中的项目开始出现,而FILE2中的项目则不存在,反之亦然。我不知道这是否是造成混乱的原因

==> FILE1 <==
128up   139
140up   170
14-3-3epsilon   4488
14-3-3zeta  24900
18w 885
26-29-p 517
2mit    3085.34
312 64
4EHP    9012.57
5.8SrRNA:CR40454    16.5
5-HT1A  1867
5-HT1B  366
5-HT2   2611.27
5-HT7   1641.67
5PtaseI 462

==> FILE2 <==
128up   80
140up   19
14-3-3epsilon   1718
14-3-3zeta  5554
18w 213
26-29-p 200
2mit    680.786
312 33
4EHP    1838.44
5-HT1A  303
5-HT1B  42
5-HT2   553.65
5-HT7   348.5
5PtaseI 105
5S_DM   46054.4

==>FILE1 FILE2您的一个文件中可能有“空格”而不是“制表符”

当其中一行中有空格时,join命令似乎会给出重复的条目:

#>bash fjoin.sh
::加入:
join:s.file1s.txt:2:未排序:128up 139
::差异:
1c1,3
<12880
---
>128080
>1280升1390
>1281390
#>grep“”文件*txt
file1s.txt:128up 139
#>grep 128up file1s.txt
128up 139
128up 139

fjoin.sh

#/bin/bash
f1=“file1.txt”
f1s=“file1s.txt”
f2=“file2.txt”
#对文件进行排序并删除重复文件
排序-K1b,1${f1}|uniq>s.${f1}
排序-K1b,1${f1s}|uniq>s.${f1s}
排序-K1b,1${f2}|uniq>s.${f2}
echo:::加入:“
join-a1-a2-e“0”-11-21-o'0,1.2,2.2'-t's${f1}s${f2}>join-1_f1_f2.txt
join-a1-a2-e“0”-11-21-o'0,1.2,2.2'-t's${f1s}s${f2}>join-2_f1_f2.txt
回声“”
回声“::差异::”
diff joined-1_f1_f2.txt joined-2_f1_f2.txt

更新

按照Pierre的建议设置
LC_ALL=C
,可能会有所帮助

导出LC_ALL=C
添加到fjoin.sh后,差异较小:

#> bash fjoin.sh
:: join ::

:: diff ::
1a2
> 128up 139 0   0

您的一个文件中可能有“空格”而不是“制表符”

当其中一行中有空格时,join命令似乎会给出重复的条目:

#>bash fjoin.sh
::加入:
join:s.file1s.txt:2:未排序:128up 139
::差异:
1c1,3
<12880
---
>128080
>1280升1390
>1281390
#>grep“”文件*txt
file1s.txt:128up 139
#>grep 128up file1s.txt
128up 139
128up 139

fjoin.sh

#/bin/bash
f1=“file1.txt”
f1s=“file1s.txt”
f2=“file2.txt”
#对文件进行排序并删除重复文件
排序-K1b,1${f1}|uniq>s.${f1}
排序-K1b,1${f1s}|uniq>s.${f1s}
排序-K1b,1${f2}|uniq>s.${f2}
echo:::加入:“
join-a1-a2-e“0”-11-21-o'0,1.2,2.2'-t's${f1}s${f2}>join-1_f1_f2.txt
join-a1-a2-e“0”-11-21-o'0,1.2,2.2'-t's${f1s}s${f2}>join-2_f1_f2.txt
回声“”
回声“::差异::”
diff joined-1_f1_f2.txt joined-2_f1_f2.txt

更新

按照Pierre的建议设置
LC_ALL=C
,可能会有所帮助

导出LC_ALL=C
添加到fjoin.sh后,差异较小:

#> bash fjoin.sh
:: join ::

:: diff ::
1a2
> 128up 139 0   0

在排序和加入之前设置
LC_ALL=C
。“谢谢你,”皮埃尔!这解决了问题,现在没有重复条目。你的链接帮了我很大的忙,实际上我把这些表格导入了我的Mac电脑,而不是从工作中加入CentOS。可能不会碰到这个问题…在排序和加入之前设置
LC_ALL=C
。“谢谢你,”皮埃尔!这解决了问题,现在没有重复条目。你的链接帮了我很大的忙,实际上我把这些表格导入了我的Mac电脑,而不是从工作中加入CentOS。可能不会碰到这个问题…谢谢,大卫!LC_ALL=C实际上解决了这个问题。我用cat-vet在两个文件中查找空格,但它们在所有行中都只显示制表符和换行符。。。我想知道这些空间可能来自哪里,以及如何看到它们在那里?谢谢,大卫!LC_ALL=C实际上解决了这个问题。我用cat-vet在两个文件中查找空格,但它们在所有行中都只显示制表符和换行符。。。我想知道这些空间可能来自哪里,以及如何看到它们在那里?