我正在使用标准连接命令来join两个基于column1sorting的文件。 该命令是简单的joinfile1 file2> output_file。
但是,如何使用相同的技术join3个或更多文件? joinfile1 file2 file3> output_file上面的命令给了我一个空文件。 我认为sed可以帮助我,但我不太清楚如何?
man join
:
NAME join - join lines of two files on a common field SYNOPSIS join [OPTION]... FILE1 FILE2
它只适用于两个文件。
如果你需要加入三个,也许你可以先加入前两个,然后加入第三个。
尝试:
join file1 file2 | join - file3 > output
应该加入这三个文件而不创建一个中间临时文件。 -
告诉连接命令从stdin
输入读取第一个输入流
可以通过递归地构建join
管道来连接多个文件(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
我知道这是一个老问题,但供将来参考。 如果你知道你想要加入的文件有一个模式就像在这里的问题,例如file1 file2 file3 ... fileN
然后你可以简单地加入这个命令
cat file* > output
输出将是按字母顺序连接的一系列连接文件。
join
man
页说明它只适用于两个文件。 所以你需要创建和中间文件,你之后删除,即:
> join file1 file2 > temp > join temp file3 > output > rm output
我为此创建了一个函数。 第一个参数是输出文件,其余参数是要连接的文件。
function multijoin() { out=$1 shift 1 cat $1 | awk '{print $1}' > $out for f in $*; do join $out $f > tmp; mv tmp $out; done }
用法:
multijoin output_file file*
加入共同字段中的两个文件的连接线。 如果你想加入更多 – 成对的做。 首先加入前两个文件,然后将结果与第三个文件加入