我正在尝试这个命令:
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