使用编号索引连接文件

使用编号索引连接文件

我正在尝试这个命令:

join -a1 -11 file1 file2 > file3

文件 1 看起来像:

1
2
3
4
5
6
7
8
9
10
11

文件2:

1    lkj    klj    lkj
2    lkj    lkj    lkj
3
7    lkj    lkj    lkj
8
9
11    lkk    kll    lkk

输出会跳过编号为 11 的行。

在谷歌搜索时,我发现它join只能理解字母顺序排序,但必须有一种方法可以做到这一点。我的目标是为一个基因项目加入五个 60,000,000 行文件。

我怎样才能做到这一点?是否有其他工具或选项可以join使其发挥作用?

答案1

我假设您的大文件已经排序。以下方法不需要进一步排序。

您可以简单地在键中添加前导零,使用sed... 因为该过程是管道式的,所以没有临时文件需要处理。开销sed是微不足道的。


# make key 9 digits    # Add 9 leading 0's       # Remove excess 0's  
join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file2)

输出是:

000000001 lkj klj lkj
000000002 lkj lkj lkj
000000003
000000004
000000005
000000006
000000007 lkj lkj lkj
000000008
000000009
000000010
000000011 lkk kll lkk

如果您不想在输出中使用前导零,请改用此命令。
额外的sed -r 's/^0+//'删除了前导零。

join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file2) |
               sed -r 's/^0+//'   

输出

1 lkj klj lkj
2 lkj lkj lkj
3
4
5
6
7 lkj lkj lkj
8
9
10
11 lkk kll lkk

答案2

您可以对输入文件进行排序,对输出进行数字排序:

join -a1 -11 <(sort -k1,1 file1) <(sort -k1,1 file2) | sort -k1,1n

相关内容