根据列值联接两个文件.原始文件具有重复值



我的两个文件如下所示:

文件 1:

18 1600000 + CAA 0 1
18 1600000 - CAC 0 11
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11
18 1600001 + CCC 0 1
18 1600001 - CCC 0 3
18 1600002 - CAT 0 1
18 1600002 - CAT 0 3

文件 2:

18 1600000 + CGG 6 6
18 1600000 - CGT 0 2
18 1600001 - CCC 0 3
18 1600001 + CGG 0 11
18 1600001 - CGG 9 9
18 1600002 - CAT 0 1
18 1600002 - CAT 0 3
18 1600002 + CAT 0 6
18 1600002 + CCA 0 5

我想根据第 2 列join这两个文件,但在不匹配的地方放置一个 NULL 值。在文件 1 中有 4 行,有 1600000,文件 2 中只有 2 行。所以我希望输出如下所示:

18 1600000 + CAA 0 1    1600000 + CGG 6 6
18 1600000 - CAC 0 11   1600000 - CGT 0 2
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11   1600001 - CCC 0 3
18 1600001 + CCC 0 1    1600001 + CGG 0 11
18 1600001 - CCC 0 3    1600001 - CGG 9 9
18 1600002 - CAT 0 1    1600002 - CAT 0 3
18 1600002 - CAT 0 3    1600002 + CAT 0 6
                        1600002 + CCA 0 5
....

我相信 join 命令可能是一个问题,因为它只使用 1 个文件作为模板。因此,如果文件2中有额外的值,我认为这些值会丢失。因此,更复杂的awk论点可能效果更好。每个文件都有一些其他文件没有的行。

你可以

像这样使用awk

awk 'NR==FNR{sub(/^[^[:blank:]]+[[:blank:]]+/, ""); a[$1,++c[$1]]=$0; next} 
     {print $0, a[$2,++d[$2]]}' OFS='t' file2 file1

输出:

18 1600000 + CAA 0 1    1600000 + CGG 6 6
18 1600000 - CAC 0 11   1600000 - CGT 0 2
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11   1600001 - CCC 0 3
18 1600001 + CCC 0 1    1600001 + CGG 0 11
18 1600001 - CCC 0 3    1600001 - CGG 9 9
18 1600002 - CAT 0 1    1600002 - CAT 0 1
18 1600002 - CAT 0 3    1600002 - CAT 0 3

此 awk 命令使用具有复合键的关联数组作为2nd column + an incrementing counter per 2nd column valuesub函数用于从第 2 个文件中丢弃第 1 列的值,因为输出中不需要该值。

相关内容

最新更新