与 awk 的完全外部连接

full outer join with awk

阅读后:

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

文件一

A 1 
C 4 

文件二

A 2 
B 5

文件三

A 7 
D 9

结果将是:

A 1    2   7 
B N    5   N 
C 4    N   N 
D N    N   9

有没有像我看到的左外连接的awk单行解决方案?

使用 GNU awk 实现真正的多维数组、ARGIND 和 sorted_in:

$ cat tst.awk
{ vals[][ARGIND] =  }
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

可以使用 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 可能更简单!