【问题标题】:full outer join with awk使用 awk 进行完全外连接
【发布时间】:2019-01-12 20:57:15
【问题描述】:

看完后:

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

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

文件一

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-one-line-solution 吗?

【问题讨论】:

  • 嗨。您正在尝试做一些涉及多个连接的事情,但目前还不清楚是什么,所以请编辑清楚。外连接需要两个表并返回一个。您的列标题在哪里?你能做什么?就左右连接而言,您如何理解完全连接返回?请阅读最小、完整和可验证的示例并采取行动。不要将链接用于对您的问题至关重要的内容,将答案需要的所有内容直接编辑到您的问题中。
  • 不要要求“单线”解决方案,因为这告诉每个人您更关心简洁性,而不是软件中真正重要的所有事情,例如清晰度、效率、可移植性、稳健性等。所以它可能会使人们不愿意提供一个好的解决方案,因为您可能会拒绝它而支持一些蹩脚的、简短的替代方案。如果出于某种原因对您很重要,任何软件都可以压缩到一行,任何软件也可以存储在一个文件中,然后该文件作为一行执行。

标签: join awk outer-join


【解决方案1】:

使用 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

【讨论】:

  • 就是这样。非常感谢!!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 2020-07-01
    • 2020-01-09
    • 2010-12-27
    • 2011-12-31
    • 1970-01-01
    • 2013-02-16
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多