加入,填补缺失的键值

mba*_*off 7 text-processing merge join

我有两个文件将主键值作为第一个字段,将相应的值作为剩余字段,其中一个中缺少一些主键值但在另一个中存在,反之亦然:

$ cat jointest1.txt jointest2.txt  
a 1  
b 2  
d 4  
e 5    

a 10  
b 11  
c 12  
d 13  
Run Code Online (Sandbox Code Playgroud)

我希望输出根据主键合并这些文件,无论是否替换缺失值,例如:

$ joinmerge  jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
c - 12  
d 4 13  
e 5 -
Run Code Online (Sandbox Code Playgroud)

用破折号或其他东西替换缺失值的能力是可选的。

我试过了join,但它说我的文件没有正确排序:

$ join jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
join: file 2 is not in sorted order  
d 4 13  
Run Code Online (Sandbox Code Playgroud)

我应该使用什么命令?

小智 11

请尝试以下操作:

> join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2
a a 1 a 10
b b 2 b 11
c - - c 12
d d 4 d 13
e e 5 - -
Run Code Online (Sandbox Code Playgroud)

或者

> join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2
a 1 10
b 2 11
c - 12
d 4 13
e 5 -
Run Code Online (Sandbox Code Playgroud)

我不确定是否/如何在没有 -o 选项的情况下实现相同的目标。-o 选项表示:首先打印连接字段,然后打印字段编号。2 来自文件 1,然后是来自文件 2 的字段 2。很遗憾,您必须知道文件的格式才能使空字段工作。


Ulr*_*arz 7

join你使用的是什么实现?有了join (GNU coreutils) 5.97,我可以使用

[0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt
a 1 10
b 2 11
c 12
d 4 13
e 5 
Run Code Online (Sandbox Code Playgroud)

并且“普通”连接也有效(但省略了 c 和 e)。有一个-e选项可以让您为空字段选择标记,但它在我的版本中似乎被破坏,只填充案例 e,而不是案例 c。