Basicamente assim para o seu exemplo de 3 arquivos
$ join file2 file3| join file1 -
1 test1 example1 foo1
2 test3 example2 foo2
3 test4 example3 foo3
4 test5 example4 foo4
Mas importante todos os seus arquivos de entrada devem ser classificados já ( sort -k 1b,1
, numericamente ordenado como seu exemplo pode não funcionar!). Então, o exemplo acima classificado on-the-fly poderia ser escrito em bash
assim:
join <(sort -k 1b,1 file2) <(sort -k 1b,1 file3) | join <(sort -k 1b,1 file1) -\
| sort -k 1n,1
E finalmente o caso genérico de n arquivos usando uma função recursiva (testada em 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
Se você sabe o que está fazendo, pode omitir os canais de classificação. Mas, da minha experiência, join
sem% explícitosort
é muitas vezes a causa de problemas.