【问题标题】:Padding Empty Field in Unix Join Operation在 Unix Join 操作中填充空字段
【发布时间】:2009-06-12 04:24:31
【问题描述】:

我有两个文件要在其中执行联合操作 基于第一列:

file1.txt

foo 1
bar 2
qux 3

file2.txt

foo x
qux y
boo z

我希望得到的结果是这样的:

foo  1 x
bar  2 -
qux  3 y
boo  - z

第 1 列的空字段被填充 用“-”。

但是为什么这个 join 命令没有像我预期的那样工作?

$ join -a1 -a2 -e"-" file1.txt file2.txt

正确的做法是什么?

【问题讨论】:

    标签: linux unix join


    【解决方案1】:

    “重要提示:FILE1 和 FILE2 必须在连接字段上排序。” (来自this 在线手册页)。

    这个问题#1。问题 #2 更糟:选项 -e 记录不充分——只能与 -o 结合使用,例如:

    $ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt
    bar 2 -
    boo - z
    foo 1 x
    qux 3 y
    

    s 前缀名称表示我事先 sorted 的文件。

    编辑:man join 解释了-o 开关(我在上面指向的在线手册页也是如此)。它指定要输出的字段(1.2 表示文件 1 中的第二个字段,&c),或 0 表示连接字段,并且是一个逗号分隔的列表。 (实际上,我不记得 0 的值,所以最初给出了一个需要 awk 后处理的笨拙解决方案,但当前的解决方案更好......并且不需要 awk!)。

    【讨论】:

    • @Alex:非常感谢。我不明白选项“-o '1.1,2.1,1.2,2.2'”。我在哪里可以找到这方面的信息?另外,如果您不介意 awk?
    • 我已经编辑了答案以解释 -o,但请查看man awk:正如我所做的那样,为了检查我的解释,我被提醒了字段编号的 0 值,我'现在已在编辑后的示例中使用,无需进行后期处理。但请记住事先对文件进行排序!-)
    • 特别感谢 -e 需要 -o 信息。我错误地认为 -e 会制造空值,而不是简单地更改空值的字符串表示形式。
    • 在许多(大多数?)情况下,-o auto 也有效。相当于 -o'0,1.2,1.3,...,1.n,2.2,2.3,...,2.m',其中 n 是文件 1 中的字段数,m 是字段数在文件 2 中。
    【解决方案2】:

    -e 仅适用于 -o

    join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt
    

    【讨论】:

    • 这个-o auto 不适用于我接受的答案。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多