问题描述
我想加入两个文件中的庆典使用公共列。我要保留两个文件都全部可配对和unpairable线。不幸的是使用加入
我可以从只有一个文件,例如保存unpairable领域。 加入-1 1-2 2 -A1 -t,
。结果
我也想保留重复项全部配对(在连接列)两个文件。
即如果file1结果
点¯xID1 A B结果
点¯xID1 C D结果
点¯xID1 D F结果
点¯xID2Ç点¯x结果
点¯xID3˚Fv结果
I'd like to join two files in bash using a common column. I want to retain both all pairable and unpairable lines from both files. Unfortunately using join
I could save unpairable fields from only one file, eg. join -1 1 -2 2 -a1 -t" "
.
I'd also want to retain all pairings for repeated entries (in join column) from both files.I.e. If file1 is
x id1 a b
x id1 c d
x id1 d f
x id2 c x
x id3 f v
和第二个文件是搜索
ID1 DF CF结果ID1 DS DG结果ID2 CV DF结果ID2作为DS结果ID3 CF CG结果
id1 df cf
id1 ds dg
id2 cv df
id2 as ds
id3 cf cg
生成的文件应该是:结果
the resulting file should be:
X ID1 A B DF CF结果点¯xID1 A B DS DG结果点¯xID1 C D DF CF结果点¯xID1 C D DS DG结果
点¯xID1 D F DF CF结果点¯xID1 D F DS DG结果点¯xID2Ç点¯xCV DF结果点¯xID2Çx作为DS结果点¯xID3˚Fv CF CG
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
这就是为什么我一直使用的 SAS ,以使这种参与,适当的排序列后。
That's why I've always using SAS to make such join, after sorting appropriate columns.
数据x;
结果合并文件1文件2;
结果通过common_column;
结果运行;
搜索
它工作正常,但结果 1 的,因为我使用Ubuntu的大部分时间,我不得不切换到Windows在SAS数据合并。结果 2 最重要的是,SAS可以截断太长的数据项。
It works fine but
1. as I use Ubuntu for most time I have to switch to Windows to merge data in SAS.
2. most importantly, SAS can truncate too long data entries.
这就是为什么我会preFER加入我的文件在bash,但我不知道相应的命令。结果
可能有人帮助我,或直接我适当的资源?
That's why I'd prefer to join my files in bash, but I don't know appropriate command.
Could someone help me, or direct me to appropriate resource?
推荐答案
据加入
的手册页, -a< FILENUM>
保留了文件中的所有行unpairable <&FILENUM GT;
(1或2)。因此,只需添加 -A1 -A2
到命令行,你应该做的。例如:
According to join
's man page, -a <filenum>
retains all unpairable lines from file <filenum>
(1 or 2). So, just add -a1 -a2
to your command line and you should be done. For example:
# 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
这是你要找的是什么?
Is this what you were looking for?
编辑:
由于您提供更多的细节,在这里是如何产生所需输出(请注意,我的文件 A
是你的第一个文件,我的文件 B
你的第二个文件。我必须扭转-1 1-2 2 -1 2 -2 1加入的ID)。我添加了一个字段列表格式化输出,以及 - 请注意,0是它的连接字段:
Since you provided more detail, here is how to produce your desired output (note that my file a
is your first file and my file b
your second file. I had to reverse -1 1 -2 2 to -1 2 -2 1 to join on the id). I added a field list to format the output as well - note that '0' is the join field in it:
# join -1 2 -2 1 -o 1.1,0,1.3,1.4,2.2,2.3 a b
产生你给什么。添加-A1 -a2保留两个文件unpairable线那么你得到两行(你可以从他们猜测我的测试数据):
produces what you've given. Add -a1 -a2 to retain unpairable lines from both files you then get two more lines (you can guess my test data from them):
x id4 u t
id5 ui oi
这是相当不可读的,因为任何离开了现场只是一个空间。因此,让我们用替换它们' - ',导致:
Which is rather unreadable since any left out field is just a space. So let's replace them with a '-', leading to:
# 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
这篇关于加入在bash像SAS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!