用awk进行完全外部连接

时间:2018-08-05 21:43:39

标签: join awk outer-join

阅读后:

Combine two files with unequal length on common column with multiple matches with linux command line

我想知道您将如何进行完全外部联接。 (希望可以用它开始一个新的问题)

提交一个

fig, ax = plt.subplots(figsize=(10,8))
plot_importance(model, ax=ax)

提交两个文件

ax = plot_importance(model)
ax.figure.set_size_inches(10,8)

提交三个

A 1 
C 4 

结果将是:

A 2 
B 5

是否有像我看到的用于左外部连接的A 7 D 9 一线解决方案?

2 个答案:

答案 0 :(得分:0)

使用GNU awk生成真正的多维数组,ARGIND和sorted_in:

$ cat tst.awk
{ vals[$1][ARGIND] = $2 }
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (key in vals) {
        printf "%s%s", key, OFS
        for (fileNr=1; fileNr<=ARGIND; fileNr++) {
            val = (fileNr in vals[key] ? vals[key][fileNr] : "N")
            printf "%s%s", val, (fileNr<ARGIND ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file1 file2 file3
A 1 2 7
B N 5 N
C 4 N N
D N N 9

答案 1 :(得分:0)

可以使用 POSIX 标准 join 命令解决此问题。鉴于问题中提出的三个文件名为 1.txt2.txt3.txt

join -a1 -a2 -eN -o 0,1.2,2.2 1.txt 2.txt | join -a1 -a2 -eN -o 0,1.2,1.3,2.2 - 3.txt

请注意,虽然这为上述问题提供了所需的输出,但与 Ed Morton 基于 awk 的解决方案相比,它的灵活性要低得多。一方面,join 需要根据共享字段对其输入文件进行排序。另一方面,它仅适用于三个输入文件。

但是,在一次性的临时情况下使用 join 可能更简单!