使用 join 合并多个文件

fug*_*ive 2 awk text-processing join

是否有一些解决方法可以根据第一列一次加入多个文件?通常,我会这样做: join File1 File2 > File1+File2File1+File2 File3 > final_output

示例文件:

文件1:

1 test1
2 test3
3 test4
4 test5
7 test7
Run Code Online (Sandbox Code Playgroud)

文件2:

1 example1
2 example2
3 example3
4 example4
8 example8
Run Code Online (Sandbox Code Playgroud)

文件3:

1 foo1
2 foo2
3 foo3
4 foo4
10 foo10
Run Code Online (Sandbox Code Playgroud)

考虑到fe第五行在每个文件中可能不同,并且有n文件数。 编辑:

示例输出:

1 test1 example1 foo1
2 test2 example2 foo2
3 test3 example3 foo3
4 test4 example4 foo4
Run Code Online (Sandbox Code Playgroud)

另一方面,我不确定如何处理 column1 中不匹配的行(第五行)谢谢

rud*_*ier 11

对于您的 3 个文件示例,基本上是这样

$ join file2 file3| join file1 -
1 test1 example1 foo1
2 test3 example2 foo2
3 test4 example3 foo3
4 test5 example4 foo4
Run Code Online (Sandbox Code Playgroud)

但重要的是,您的所有输入文件都必须已经排序(sort -k 1b,1,像您的示例那样进行数字排序可能不起作用!)。因此,上面即时排序的示例可以这样编写bash

join <(sort -k 1b,1 file2) <(sort -k 1b,1 file3) | join <(sort -k 1b,1 file1) -\
  | sort -k 1n,1
Run Code Online (Sandbox Code Playgroud)

最后是使用递归函数的 n 个文件的一般情况(在 中测试bash):

xjoin() {
    local f
    local srt="sort -k 1b,1"

    if [ "$#" -lt 2 ]; then
            echo "xjoin: need at least 2 files" >&2
            return 1
    elif [ "$#" -lt 3 ]; then
            join <($srt "$1") <($srt "$2")
    else
            f=$1
            shift
            join <($srt "$f") <(xjoin "$@")
    fi
}

xjoin file1 file2 file3 | sort -k 1n,1
Run Code Online (Sandbox Code Playgroud)

如果您知道自己在做什么,则可以省略排序管道。但从我的经验来看,join没有明确sort的往往是麻烦的原因。