我的两个文件类似于以下内容:
文件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
我希望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
....
我认为join
命令可能是个问题,因为它只使用1个文件作为模板。因此,如果文件2中有额外的值,我认为这些将丢失。因此,更复杂的awk
参数可能会更好。每个文件都有一些行,而另一个文件没有。
答案 0 :(得分:5)
您可以像这样使用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 value
。 sub
函数用于从第二个文件中丢弃第一列的值,因为输出中不需要。