根据第三个文件中的映射合并两个文件

时间:2017-05-04 11:13:01

标签: unix join awk

我需要根据另一个文件中包含的映射合并两个文件。因此,在下面的示例中,将file1与file2连接,其中file1中的第2列与file3中的第2列匹配,而file2中的第2列与file3中的第4列匹配。

优选地,使用诸如awk等的unix程序的解决方案。

文件1:

Scf_3L  12798910    T   0   41  0   0   NA  NA
Scf_3L  12798911    C   0   0   43  0   NA  NA
Scf_3L  12798912    A   42  0   0   0   NA  NA
Scf_3L  12798913    G   0   0   0   44  NA  NA
Scf_3L  12798914    T   0   42  0   0   NA  NA
Scf_3L  12798915    G   0   0   0   44  NA  NA
Scf_3L  12798916    T   0   42  0   0   NA  NA
Scf_3L  12798917    A   41  0   0   0   NA  NA
Scf_3L  12798918    G   0   0   0   43  NA  NA
Scf_3L  12798919    T   0   43  0   0   NA  NA
Scf_3L  12798920    T   0   41  0   0   NA  NA

file2的:

3L  12559896    T   0   31  0   0   NA  NA
3L  12559897    C   0   0   33  0   NA  NA
3L  12559898    A   34  0   0   0   NA  NA
3L  12559899    G   0   0   0   33  NA  NA
3L  12559900    T   0   34  0   0   NA  NA
3L  12559901    G   0   0   0   33  NA  NA
3L  12559902    T   0   33  0   0   NA  NA
3L  12559903    A   33  0   0   0   NA  NA
3L  12559904    G   0   0   0   33  NA  NA
3L  12559905    T   0   34  0   0   NA  NA
3L  12559906    T   0   33  0   0   NA  NA

file3的:

3L  12798910    T   12559896    T
3L  12798911    C   12559897    C
3L  12798912    A   12559898    A
3L  12798913    G   12559899    G
3L  12798914    T   12559900    T
3L  12798915    G   12559901    G
3L  12798916    T   12559902    T
3L  12798917    A   12559903    A
3L  12798918    G   12559904    G
3L  12798919    T   12559905    T
3L  12798920    T   12559906    T

输出:

Scf_3L  12798910    T   0   41  0   0   NA  NA    3L    12559896    T   0   31  0   0   NA  NA
Scf_3L  12798911    C   0   0   43  0   NA  NA    3L    12559897    C   0   0   33  0   NA  NA
Scf_3L  12798912    A   42  0   0   0   NA  NA    3L    12559898    A   34  0   0   0   NA  NA
Scf_3L  12798913    G   0   0   0   44  NA  NA    3L    12559899    G   0   0   0   33  NA  NA
Scf_3L  12798914    T   0   42  0   0   NA  NA    3L    12559900    T   0   34  0   0   NA  NA
Scf_3L  12798915    G   0   0   0   44  NA  NA    3L    12559901    G   0   0   0   33  NA  NA
Scf_3L  12798916    T   0   42  0   0   NA  NA    3L    12559902    T   0   33  0   0   NA  NA
Scf_3L  12798917    A   41  0   0   0   NA  NA    3L    12559903    A   33  0   0   0   NA  NA
Scf_3L  12798918    G   0   0   0   43  NA  NA    3L    12559904    G   0   0   0   33  NA  NA
Scf_3L  12798919    T   0   43  0   0   NA  NA    3L    12559905    T   0   34  0   0   NA  NA
Scf_3L  12798920    T   0   41  0   0   NA  NA    3L    12559906    T   0   33  0   0   NA  NA

2 个答案:

答案 0 :(得分:2)

您可以使用join命令的两个咒语:

join -o1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.10,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9 -1 1 -2 2 <(join -o 2.4,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.1,2.2,2.3 -1 2 -2 2 file1 file3) file2 

选项-o只列出输出的字段。

内部join使用映射file1加入file3,并使用file2

为第二个外部联接提供密钥

如果列的顺序不重要,您可以跳过-o选项并使用以下内容:

join -1 12 -2 2 <(join  -1 2 -2 2 file1 file3 ) file2

答案 1 :(得分:0)

尽管这最初是使用UNIX内置程序寻找答案,但我选择使用perl,并且可以在此处找到一个不错的解决方案:Merge files based on a mapping in another file