根据列值加入两个文件.原始文件具有重复值

Rya*_*cny 1 linux bash awk join sed

我的两个文件看起来如下所示:

档案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
Run Code Online (Sandbox Code Playgroud)

文件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
Run Code Online (Sandbox Code Playgroud)

我想join基于第2列的两个文件,但在没有匹配的地方放置一个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
....
Run Code Online (Sandbox Code Playgroud)

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

anu*_*ava 5

你可以awk像这样使用:

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

输出:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 打败了我....非常好,有用的解决方案@anubhava ....谢谢:) (2认同)
  • 如果OP正在寻找"左外连接",而不是"完全外连接",这是一个非常好的解决方案.无论如何提升,因为它真的很有启发性. (2认同)