awk - para adicionar uma coluna após corresponder as colunas restantes

3

Eu tenho um arquivo ( file1.txt ) com o conteúdo como abaixo.

8145216 3377090 1.5
1405541 53595498 1.53637

Eu preciso gerar todas as combinações possíveis para as duas primeiras colunas no arquivo acima. Eu uso um programa php como discutido em esta resposta para gerar todas as combinações.

Depois de descobrir as combinações, eu tenho meu arquivo como abaixo.

3377090 8145216
1405541 8145216
1405541 3377090
53595498 8145216
53595498 3377090
53595498 1405541

No arquivo acima, preciso anexar os valores da 3ª coluna de arquivo1.txt e se o valor não estiver presente no arquivo1 .txt Eu preciso acrescentar 0 como a terceira coluna. A saída final que estou tentando obter é,

3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637
    
por Ramesh 10.04.2014 / 22:45

3 respostas

2
awk 'NR==FNR{a[$1>=$2?$1SUBSEP$2:$2SUBSEP$1]=$3;next};
{k=$1>=$2?$1SUBSEP$2:$2SUBSEP$1; print $0, k in a?a[k]:0}' file1.txt file2.txt
3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637
    
por 11.04.2014 / 03:11
2
Pessoalmente, eu faria a coisa toda no Awk do arquivo original em vez da metade no PHP e metade no Awk ou no Perl. Dado file1.txt acima, o seguinte irá produzir a saída desejada:

{
    Vals[$1]++;
    Vals[$2]++;
    Third_col[$1, $2] = Third_col[$2, $1] = $3;
}
END{
    for (i in Vals) {
        for (j in Vals) { 
            if (i == j || (i SUBSEP j in printed)) { continue } 
            Third_col_val = (i SUBSEP j in Third_col) ? Third_col[i, j] : 0; 
            print i, j, Third_col_val; 
            printed[j, i]++; 
            printed[i, j]++ 
        } 
    } 
}

Note que isso leva o tempo O (n 2 ), então para listas muito grandes (milhões de linhas), ele ficará lento e consome muita memória.

    
por 12.04.2014 / 10:53
1

Outra solução awk :

$ awk 'FNR==NR{a[$1,$2]=$3;next}
    {print $0,a[$1,$2]?a[$1,$2]:a[$2,$1]?a[$2,$1]:0}
' file1 file2
3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637
    
por 11.04.2014 / 08:10

Tags