Awk - Forma eficiente de corresponder a combinação exclusiva de valores entre arquivos

0

Eu tenho um arquivo que contém vários IDs nas duas primeiras colunas e valores no terceiro; várias combinações de ID são repetidas em vários arquivos. A ideia geral é somar todos esses valores para cada combinação exclusiva de IDs. Por exemplo, para somar todos os valores da terceira coluna para todas as linhas nas quais os IDs 141 e 142 são vistos juntos. Um problema é que a combinação de IDs pode ser revertida; algumas linhas podem mostrar 142 na primeira coluna e 141 na segunda, enquanto outras o oposto. Outro problema é que nem todas as combinações aparecem nesses arquivos, caso em que um valor de zero deve ser atribuído. O arquivo que contém os IDs nas duas primeiras colunas e os valores, values.txt , são assim:

141 142 3.4
142 141 5.4
143 141 3.2
142 143 3.6
143 142 4.2
145 143 2.1
143 145 1.9
141 142 2.3
141 143 1.2

Portanto, o resultado desejado, matrix.txt deve ser assim:

141 142 11.1
141 143 4.4
141 144 0
141 145 0
142 143 7.8
142 144 0
142 145 0
143 144 0
143 145 4

Eu criei um script que alcança o resultado desejado. Primeiro, eu criei um arquivo que contém todas as combinações de pares possíveis sem repetição (por exemplo, a combinação entre os IDs 141-142 será mostrada apenas uma vez, porque é o mesmo que 142-141). O arquivo combination.txt tem esta aparência:

141 142
141 143
141 144
141 145
142 143
142 144
142 145
143 144
143 145
144 145

Em seguida, usando o código a seguir, criei uma matriz a partir do arquivo combination.txt . Nesta matriz, adicionarei os valores sempre que os índices corresponderem, usando uma matriz feita a partir do arquivo values.txt e outra com as colunas invertidas do mesmo arquivo.

awk 'FNR==NR{
  a[$1" "$2]+=$3; b[$2" "$1]+=$3; next} {
  matrix[$1" "$2]=0} {
    for (i in matrix) matrix[i]=b[i]+a[i]}
     END { 
            for (i in matrix) print i" "matrix[i]}' values.txt combination.txt > matrix.txt

No entanto, estou lidando com um total de 2967 IDs, levando a um total de 4400061 combinações possíveis. Eu não tive sorte com isso porque está demorando muito. Existe uma maneira mais eficiente de conseguir isso?

    
por Tomas 12.09.2018 / 16:35

0 respostas

Tags