Mesclar vários arquivos com join

3

Existe alguma solução alternativa para juntar vários arquivos de uma só vez com base na primeira coluna? Normalmente, eu faria:   join File1 File2 > File1+File2 e File1+File2 File3 > final_output

Arquivos de exemplo:

Arquivo1:

1 test1
2 test3
3 test4
4 test5
7 test7

Arquivo2:

1 example1
2 example2
3 example3
4 example4
8 example8

Arquivo3:

1 foo1
2 foo2
3 foo3
4 foo4
10 foo10

Considerando que f.e. quinta linha pode diferir em cada arquivo, e há n número de arquivos. Editar:

Exemplo de saída:

1 test1 example1 foo1
2 test2 example2 foo2
3 test3 example3 foo3
4 test4 example4 foo4

Por outro lado, não sei como as linhas que não correspondem na coluna 1 serão processadas (quinta linha) Obrigado

    
por fugitive 12.05.2017 / 22:28

1 resposta

11

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.

    
por 12.05.2017 / 22:41