像 SAS 一样加入 bash

boc*_*767 3 bash join sas

我想使用公共列在bash中加入两个文件。我想保留两个文件中所有可配对和不可配对的行。不幸的是,使用join我只能保存一个文件中不可配对的字段,例如。join -1 1 -2 2 -a1 -t" "
我还想保留两个文件中重复条目(在连接列中)的所有配对。即如果 file1 是
x id1 ab
x id1 cd
x id1 df
x id2 cx
x id3 fv

第二个文件是

id1 df cf
id1 ds dg
id2 cv df
id2 as ds
id3 cf cg

生成的文件应该是:

x id1 ab df cf
x id1 ab ds dg
x id1 cd df cf
x id1 cd ds dg
x id1 df df cf
x id1 df ds dg
x id2 cx cv df
x id2 cx 作为 ds
x id3 fv cf cg

这就是为什么我总是在对适当的列进行排序后使用SAS进行此类连接。

data x;
merge file1 file2;
by common_column;
run;

它工作正常,但是
1.由于我大部分时间都使用 Ubuntu,所以我必须切换到 Windows 来合并 SAS 中的数据。
2.最重要的是,SAS可以截断太长的数据条目。

这就是为什么我更愿意在 bash 中加入我的文件,但我不知道合适的命令。
有人可以帮助我,或指导我找到适当的资源吗?

fir*_*dle 5

根据 的join手册页,-a <filenum>保留文件中所有不可配对的行<filenum>(1 或 2)。因此,只需添加-a1 -a2到您的命令行即可完成。例如:

# cat a
1 blah
2 foo

# cat b
2 bar
3 baz

# join -1 1 -2 1 -t" " a b
2 foo bar

# join -1 1 -2 1 -t" " -a1 a b
1 blah
2 foo bar

# join -1 1 -2 1 -t" " -a2 a b
2 foo bar
3 baz

# join -1 1 -2 1 -t" " -a1 -a2 a b
1 blah
2 foo bar
3 baz
Run Code Online (Sandbox Code Playgroud)

这是您要找的吗?

编辑:

由于您提供了更多详细信息,因此以下是如何生成所需的输出(请注意,我的文件a是您的第一个文件,我的文件是b您的第二个文件。我必须将 -1 1 -2 2 反转为 -1 2 -2 1 才能加入身份证)。我还添加了一个字段列表来格式化输出 - 请注意,“0”是其中的连接字段:

# join -1 2 -2 1 -o 1.1,0,1.3,1.4,2.2,2.3 a b
Run Code Online (Sandbox Code Playgroud)

产生你所给予的东西。添加 -a1 -a2 以保留两个文件中不可配对的行,然后您会得到另外两行(您可以从中猜测我的测试数据):

x id4 u t
 id5   ui oi
Run Code Online (Sandbox Code Playgroud)

这是相当不可读的,因为任何遗漏的字段都只是一个空格。因此,让我们将它们替换为“-”,结果是:

# join -1 2 -2 1 -a1 -a2 -e- -o 1.1,0,1.3,1.4,2.2,2.3 a b
x id1 a b df cf
x id1 a b ds dg
x id1 c d df cf
x id1 c d ds dg
x id1 d f df cf
x id1 d f ds dg
x id2 c x cv df
x id2 c x as ds
x id3 f v cf cg
x id4 u t - -
- id5 - - ui oi
Run Code Online (Sandbox Code Playgroud)