我想使用Unix命令行实用程序(例如“join
”)连接两个共享已经排序的公共标识符列的文件。我想保留不匹配的行,并且还要保持匹配和不匹配行之间的列顺序的完整性,即使标识符列不在第一行中也是如此。
例如,考虑两个文件,1.txt和2.txt:
val1,val2,key
1a,1b,1
2a,2b,2
3a,3b,3
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
中的一个错误(我无法看到为什么我所寻找的东西在所有情况下都不是首选行为,但我当然可能会遗漏一些东西)。如果是这样的话,我很乐意帮助解决......
答案 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