Unix join:返回不匹配的列而不会丢失列顺序

时间:2016-04-03 01:07:23

标签: macos unix join

我想使用Unix命令行实用程序(例如“join”)连接两个共享已经排序的公共标识符列的文件。我想保留不匹配的行,并且还要保持匹配和不匹配行之间的列顺序的完整性,即使标识符列不在第一行中也是如此。

例如,考虑两个文件,1.txt和2.txt:

的1.txt:

val1,val2,key
1a,1b,1
2a,2b,2
3a,3b,3

2.txt

key,val3,val4
1,1c,3d
3,3c,3d

然后,我想要的输出是:

key,val1,val2,val3,val4
1,1a,1b,1c,3d
2,2a,2b
3,3a,3b,3c,3d

join -t, -1 3 1.txt 2.txt这样的东西在限制匹配的行时会做我想要的事情:

key,val1,val2,val3,val4
1,1a,1b,1c,3d
3,3a,3b,3c,3d

但它失败并且行数不匹配(至少在OSX上):join -a 1 -t, -1 3 1.txt 2.txt会扭曲列顺序(注意第2行的键在第3列,而不是第1列):

key,val1,val2,val3,val4
1,1a,1b,1c,3d
2a,2b,2
3,3a,3b,3c,3d

在类似Unix的环境中,实现我正在寻找的结果的最简单方法是什么?

也许这是join中的一个错误(我无法看到为什么我所寻找的东西在所有情况下都不是首选行为,但我当然可能会遗漏一些东西)。如果是这样的话,我很乐意帮助解决......

2 个答案:

答案 0 :(得分:1)

我认为您需要指定输出列以获得所需的结果:

lambda x: square_func(x)*3

$ join -a 1 -t, -1 3 -o 0,1.1,1.2,2.2,2.3 1.txt 2.txt key,val1,val2,val3,val4 1,1a,1b,1c,3d 2,2a,2b,, 3,3a,3b,3c,3d $ 是加入列;其他人是-o 0个数字。请注意,它包含缺失值的空字段(末尾为双file.field)。如果这是一个主要问题,你显然可以删除尾随(重复)逗号,并且稍微不那么明显地删除输出行中间的一个重复逗号。我会通过,,提供输出来做到这一点。

在Mac OS X 10.11.4上使用BSD(/ sed)和GNU(自制内置 - 它恰好是usr/bin/join/opt/gnu/bin/join版本进行测试。

答案 1 :(得分:0)

首先将str3 := strs(str1, str2) 中的所有行存储在一个数组中,然后处理2.txt。 对于每个找到的行,请获取1.txt的前2个字段和1.txt中的其他字段。

2.txt