1

根据它们的第一列,我有两个要加入的文件。

它们已排序,并非 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

如您所见,FILE2 中的一个元素 (snRNA:U5:38ABb) 在 FILE1 中丢失,而 FILE1 中的一个元素在 FILE2 中丢失。在整个文件中都是这种情况,无论是双向还是多次。

我正在编写如下命令:

join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t '        ' 
FILE1.TXT FILE2.TXT
>JOIN_FILE.TXT

如果我仅使用从每个文件中粘贴的 20 行左右的行来尝试该命令,它就可以正常工作。

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

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

snRNA:7SK   0   1037
snRNA:U11   0   144
snRNA:U1:21D    0   348.293
snRNA:U12:73B   0   16
snRNA:U1:82Eb   0   2.14286
snRNA:U1:95Ca   0   348.293
snRNA:U1:95Cb   0   351.96
snRNA:U1:95Cc   0   35.5095
snRNA:U2:14B    0   447.35
snRNA:U2:34ABa  0   459.75
snRNA:U2:34ABb  0   513.25
snRNA:U2:34ABc  0   509
snRNA:U2:38ABa  0   443.65
snRNA:U4:38AB   0   155
snRNA:U4:39B    0   611.833
snRNA:U4atac:82E    0   152.5
snRNA:U5:14B    0   1
snRNA:U5:23D    0   2.5
snRNA:U5:34A    0   11
snRNA:U5:38ABb  0   2.5
snRNA:U5:63BC   0   44
snRNA:U6:96Aa   0   18
snRNA:U6:96Ab   0   9.5
snRNA:U6:96Ac   0   8.5
snRNA:U7    0   4
snRNA:7SK   1259    0
snRNA:U11   33  0
snRNA:U1:21D    1480.57 0
snRNA:U12:73B   4   0
snRNA:U1:82Eb   10.2    0
snRNA:U1:95Ca   1480.57 0
snRNA:U1:95Cb   1484.03 0
snRNA:U1:95Cc   114.633 0
snRNA:U2:14B    4678.89 0
snRNA:U2:34ABa  4789.93 0
snRNA:U2:34ABb  5292.22 0
snRNA:U2:34ABc  5273.23 0
snRNA:U2:38ABa  4557.88 0
snRNA:U2:38ABb  3.75    0
snRNA:U4:38AB   405 0
snRNA:U4:39B    1503.5  0
snRNA:U4atac:82E    548 0
snRNA:U5:14B    25  0
snRNA:U5:23D    19  0
snRNA:U5:34A    32  0
snRNA:U5:38ABb  4   0
snRNA:U5:63BC   742 0
snRNA:U6:96Aa   39.5    0
snRNA:U6:96Ab   1   0
snRNA:U6:96Ac   1   0
snRNA:U7    11  0

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

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

有没有办法解决这个问题?

非常感谢!卡门

编辑:

这是每个文件的前 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
4

1 回答 1

1

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

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

#>  bash fjoin.sh 
:: join ::
join: s.file1s.txt:2: is not sorted: 128up  139

:: diff ::
1c1,3
< 128up 139 80
---
> 128up 0   80
> 128up 139 0   0
> 128up 139 0

#>  grep " " file*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"

# sort files & remove duplicate
sort -k 1b,1 ${f1} | uniq > s.${f1}
sort -k 1b,1 ${f1s} | uniq > s.${f1s}
sort -k 1b,1 ${f2} | uniq > s.${f2}

echo ":: join ::"
join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t '   ' s.${f1} s.${f2} > joined-1_f1_f2.txt
join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t '   ' s.${f1s} s.${f2} > joined-2_f1_f2.txt

echo " "
echo ":: diff ::"
diff joined-1_f1_f2.txt joined-2_f1_f2.txt

更新

LC_ALL=C皮埃尔建议的设置可能会有所帮助。

export LC_ALL=C添加到 fjoin.sh后差异较小:

#> bash fjoin.sh
:: join ::

:: diff ::
1a2
> 128up 139 0   0
于 2013-05-12T17:39:48.633 回答