Como combinar colunas de dois arquivos, remover duplicatas e preencher linhas ausentes

2

Eu tenho dois arquivos separados que gostaria de combinar. Cada um tem 7 colunas como tal:

1 10 6 0.02 A 45 0.17
1 15 6 0.03 A 67 0.17
2 33 6 0.10 A 23 0.17 

e

1 10 6 0.04 B 87 0.17
1 12 6 0.12 B 93 0.17
2 33 6 0.08 B 45 0.17

Gostaria de combinar as colunas 1 e 2 de cada arquivo ao remover duplicatas e depois adicionar a coluna 4 5 6 de cada arquivo à combinação correspondente da coluna 1 e 2. Então, se as colunas 1 e 2 não corresponderem, como eles para serem impressos no entanto, para o arquivo faltando para colocar 0 em vez da coluna 4 5 e 6 de tal forma que o arquivo final seria

1 10 0.02 A 45 0.04 B 87
1 12 0    0 0  0.12 B 93
1 15 0.03 A 67 0    0 0
2 33 0.10 A 23 0.08 B 45
    
por Dylan Girodat 07.12.2017 / 04:14

1 resposta

2

Uma maneira simples de fazer isso é usar uma matriz 2D no awk

FNR==NR {a[$1FS$2][0]=$4FS$5FS$6; next}
        {a[$1FS$2][1]=$4FS$5FS$6}
END {
    empty="0"FS"0"FS"0"
    for(i in a)
        print i FS (a[i][0]? a[i][0] : empty) FS (a[i][1]? a[i][1] : empty)
}

Você pode salvar o script como um arquivo e executar

awk -f main.awk file1 file2

Explicação

  • A primeira linha FNR==NR verifica o arquivo1 e armazena as colunas desejadas $4 $5 $6 com a chave associada $1 $2 em uma matriz a[$1FS$2][0]
  • A segunda linha faz basicamente a mesma coisa no arquivo2, mas armazena o valor na matriz a[$1FS$2][1] , observe que essas operações de atribuição de matriz removerão automaticamente as duplicatas, pois as matrizes no awk são associativas , o que significa que cada chave pode aparecer apenas uma vez
  • Na etapa final, em END , imprima cada linha e substitua cada valor vazio por uma string predefinida 0 0 0
  • Se você quiser que a saída seja classificada por ordem de valor de índice crescente, adicione um PROCINFO["sorted_in"] = "@ind_str_asc" à primeira linha dentro de END

Se você tiver tempo, seria bastante útil consultar o Guia de Programação Gawk bem documentado

    
por 07.12.2017 / 08:58