加入多个文件

pra*_*kar 14 linux join sed

我使用标准join命令基于column1连接两个已排序的文件.该命令是简单的join file1 file2> output_file.

但是如何使用相同的技术加入3个或更多文件?join file1 file2 file3> output_file上面的命令给了我一个空文件.我认为sed可以帮助我,但我不太确定如何?

mat*_*ata 22

man join:

NAME
       join - join lines of two files on a common field

SYNOPSIS
       join [OPTION]... FILE1 FILE2
Run Code Online (Sandbox Code Playgroud)

它只适用于两个文件.

如果你需要加入三个,也许你可以先加入前两个,然后加入第三个.

尝试:

join file1 file2 | join - file3 > output
Run Code Online (Sandbox Code Playgroud)

应该加入三个文件而不创建中间临时文件.-告诉join命令从中读取第一个输入流stdin


ack*_*ack 11

可以通过join递归地构造s 的管道来连接多个文件(N> = 2):

#!/bin/sh

# multijoin - join multiple files

join_rec() {
    if [ $# -eq 1 ]; then
        join - "$1"
    else
        f=$1; shift
        join - "$f" | join_rec "$@"
    fi
}

if [ $# -le 2 ]; then
    join "$@"
else
    f1=$1; f2=$2; shift 2
    join "$f1" "$f2" | join_rec "$@"
fi
Run Code Online (Sandbox Code Playgroud)


rsz*_*rsz 8

我知道这是一个老问题,但供将来参考.如果您知道要加入的文件具有类似问题的模式,例如,file1 file2 file3 ... fileN 那么您可以使用此命令简单地加入它们

cat file* > output
Run Code Online (Sandbox Code Playgroud)

其中输出将是按字母顺序连接的一系列连接文件.

  • 问题是将输入文件中的相应行连接在一起.没有连接它们. (13认同)
  • 那么你可能在每个文件中都有一些标题,表明它是什么类型的文件,所以这还不够,但你应该为此寻找其他问题,我相信有人已经解决了 (2认同)

gma*_*ari 5

我为此创建了一个函数。第一个参数是输出文件,其余参数是要连接的文件。

function multijoin() {
    out=$1
    shift 1
    cat $1 | awk '{print $1}' > $out
    for f in $*; do join $out $f > tmp; mv tmp $out; done
}
Run Code Online (Sandbox Code Playgroud)

用法:

multijoin output_file file*
Run Code Online (Sandbox Code Playgroud)