与 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.txt
、2.txt
和 3.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
可能更简单!
阅读后:
我想知道您将如何进行完全外部联接。 (希望可以用它开始一个新问题)
文件一
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.txt
、2.txt
和 3.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
可能更简单!