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。很遗憾,您必须知道文件的格式才能使空字段工作。
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。