Mesclando dois arquivos Unix

0

Eu tenho 2 arquivos delimitados por pipe, digamos file1 e file2. Onde arquivo1 diz 33 colunas e arquivo2 pode ter 34/35/36 colunas. Então, não vamos considerar quantas colunas temos.
O que eu quero fazer é comparar os valores em file1 & arquivo2 (da coluna 1 até a coluna 32). Se todos os valores forem iguais, pegue os valores do arquivo2 e anexe todos os mesmos registros no arquivo1. Digamos que, para os primeiros registros no arquivo2, cinco correspondências no arquivo1 tenham o valor "| 84569 | 21.5 | 1" e o anexem a todas as correspondências no arquivo1 (consulte o arquivo3 para obter os resultados esperados). Da mesma forma, para o 2º registro no arquivo2, temos 5 correspondências no arquivo1, portanto, pegue o valor "| 0" e anexe-o a todos os registros correspondentes no arquivo1. O mesmo acontece com o terceiro registro do arquivo2. Existem 3 correspondências, então tome o valor "| 21457879 | 12.4" e anexe-o nas 3 linhas correspondentes no arquivo1

Se você está pensando como estamos selecionando de onde tirar os valores do arquivo2 para anexar no arquivo1, então devemos levá-lo da coluna nº 34. Embora a posição inicial seja fixa, mas a posição final não é. Como se no exemplo "a" tivéssemos obtido valores de col 34/35/36, mas para "b", temos apenas col 34. no entanto, para "c", temos valores em col 34/35.

Eu não sei como formatar os dados nos meus exemplos abaixo. Então, dando como é.

arquivo1

a|a1|a2|a3|a4|...|a32|[email protected]
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24 
c|c1|c2|c3|c4|...|c32|[email protected] 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31 

arquivo2

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 

Arquivo esperado: arquivo3

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06|21457879|12.4 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31|21457879|12.4 
    
por mdx 24.04.2015 / 12:44

1 resposta

1

Nesta resposta, você precisa especificar quantos campos compõem a "chave". Aparentemente, em seus dados reais, é 32, mas nos dados de amostra, os primeiros 7 campos são a chave:

awk -F'|'  -v nKeys=7 '
    NR==FNR {
        suff = ""
        for (i=nKeys+2; i<=NF; i++) suff = suff FS $i
        NF = nKeys
        suffixes[$0]=suff
        next
    } 
    {
        printf "%s", $0
        NF = nKeys
        print line suffixes[$0]
    }
' file2 file1 

Podemos calcular o número de campos principais:

awk -v nKeys=$(( $(head -1 file1 | tr '|' '\n' | wc -l) - 1 )) ...

Mas provavelmente podemos codificar com segurança o número.

    
por 24.04.2015 / 15:37