2009-06-12 41 views
13

我有两个文件,我想基于第一列执行UNION操作 :填充空字段加入操作

FILE1.TXT

foo 1 
bar 2 
qux 3 

FILE2.TXT

foo x 
qux y 
boo z 

我希望得到的结果是这样的:

foo 1 x 
bar 2 - 
qux 3 y 
boo - z 

其中列1的空字段用“ - ”填充 。

但是,为什么这个连接命令不能像我预期的那样工作?

$ join -a1 -a2 -e"-" file1.txt file2.txt 

什么是正确的做法?

回答

21

“重要提示:FILE1和FILE2必须在连接字段上排序。” (从this在线手册页)。

这个问题#1。问题2更糟糕的是:选项-e被严重记录 - 只能结合-o,因此,例如:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt 
bar 2 - 
boo - z 
foo 1 x 
qux 3 y 

其中s前缀名,指示我已经sort事先编辑的文件。

编辑:man join解释了-o开关(我在上面指出的在线手册页)。它指定要输出的字段(1.2表示来自文件1的第二个字段,& c),或0表示连接字段,并且是一个以逗号分隔的列表。 (我实际上并不记得0值,所以最初给出了一个需要awk后期处理的笨拙解决方案,但目前的解决方案更好......并且不需要awk!)。

+0

@Alex:非常感谢。我不明白选项“-o'1.1,2.1,1.2,2.2'”。我在哪里可以找到有关此信息?另外如果你不介意awk请吗? – neversaint 2009-06-12 07:14:24

2

-e只适用于-o

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt