开发者社区 问答 正文

如何在Linux中使用join合并不等长(内部连接)的以空格分隔的文件?

我有一个简单的问题:我有一个用空格分隔的文件,想从另一个用空格分隔的文件中添加一列,但是第二个文件较长。我想执行内部联接(因此仅添加列而不是行)。我想用linux join来做(出于效率考虑)。我曾见过类似的问题,但由于我只是一个初学者,所以我无法提取所需的信息并将其应用于我的案子。

我删除了标题,并在关键列(两个文件的第一列)上进行了排序。我检查了重复的钥匙(没有钥匙)。

join -1 1 -1 1 <(sort -k1 file1) <(sort -k1 file2) > file3

File 1:
rs1248851 C 655 0.7666 -0.8358 0.4033
rs1248857 G 654 1.069 0.4283 0.6684
rs1248860 G 656 1.052 0.3234 0.7464
rs12488651 G 652 1.246 1.343 0.1792
rs1248865 C 649 0.7419 -0.9125 0.3615
rs1248866 C 649 0.7696 -0.8053 0.4207
rs1248868 C 649 0.7717 -0.8317 0.4056
rs1248869 T 647 0.7878 -0.766 0.4437

File 2:
rs1248851 G
rs1248857 A
rs1248858 C
rs1248859 C
rs1248860 A
rs1248861 T
rs12488651 T
rs1248865 G
rs1248866 G
rs1248867 G
rs1248868 T
rs1248869 C

Expected result File 3:
rs1248851 C 655 0.7666 -0.8358 0.4033 G
rs1248857 G 654 1.069 0.4283 0.6684 A
rs1248860 G 656 1.052 0.3234 0.7464 A
rs12488651 G 652 1.246 1.343 0.1792 T
rs1248865 C 649 0.7419 -0.9125 0.3615 G
rs1248866 C 649 0.7696 -0.8053 0.4207 G
rs1248868 C 649 0.7717 -0.8317 0.4056 T
rs1248869 T 647 0.7878 -0.766 0.4437 C


Actual resulting error message:
join: /dev/fd/63:5: is not sorted: rs1248865 C 649 0.7419 -0.9125 0.3615
join: /dev/fd/62:8: is not sorted: rs1248865 G

展开
收起
祖安文状元 2020-01-06 16:27:05 536 分享 版权
1 条回答
写回答
取消 提交回答
  • 不确定您的逻辑join或抱怨的原因,但是...

    awk 'NR==FNR{a[$1]=$0};NR!=FNR{if($1 in a){print a[$1],$2}}' file1 file2
    rs1248851 C 655 0.7666 -0.8358 0.4033 G
    rs1248857 G 654 1.069 0.4283 0.6684 A
    rs1248860 G 656 1.052 0.3234 0.7464 A
    rs12488651 G 652 1.246 1.343 0.1792 T
    rs1248865 C 649 0.7419 -0.9125 0.3615 G
    rs1248866 C 649 0.7696 -0.8053 0.4207 G
    rs1248868 C 649 0.7717 -0.8317 0.4056 T
    rs1248869 T 647 0.7878 -0.766 0.4437 C
    
    

    让我们打破僵局。同时NR(所有输入中的记录编号)匹配FNR(文件记录编号),我们使用第一列的条目作为索引将每一行保存到数组中。

    当我们到达第二个文件,并且它的第一列可以在我们先前创建的数组中找到时,我们先打印第一个文件的行,然后打印第二个文件的第二列。

    2020-01-06 16:27:13
    赞同 展开评论