Dado o conteúdo do valor-chave, como eu agrupo valores por chave e classifico por valor?

1

Tenho o seguinte formato de entrada de amostra (arquivo ou stdin):

key1: 1
key2: 2
key3: 3
key1: 4
key2: 5
key3: 6

Existe algum liner que pode agrupar valores com base na chave e, em seguida, ordenar?

A saída esperada seria uma das tabelas:

key1 key2 key3
1    2    3
4    5    6

que pode ser depois classificado por coluna (por exemplo, sort -k2 ). Semelhante a este exemplo .

Ou em formato semelhante, como:

key1: 1 4
key2: 2 5
key3: 3 6

Qual é a maneira mais fácil de conseguir essa transformação?

    
por kenorb 26.04.2015 / 12:44

2 respostas

2

Parece um trabalho para awk . Permite de alguma forma o uso de matrizes multidimensionais associativas.
O seguinte script bash deve fazer o trabalho.

awk ' { Nb[$1]++;b[$1][Nb[$1]]=$2 }       
      END{ for (i in Nb) {                
        printf("%s ", i);               
        for (j = 1 ; j<=Nb[i]; j++) printf("%ld ", b[i][j]);
       printf(" \n") ; }   
      }' aaa.txt  | sort

Algumas notas:

  • Na primeira parte, {...} varre todo o arquivo externo aaa.txt e carrega os arrays b[][] e o número de ocorrências de cada chave Nb[] (talvez você tenha 4 instâncias de chave3 e 12 de key1 ...).

  • Na parte END{...} de cada chave encontrada for (i in Nb) imprime a chave sem nova linha ( printf(...) ) e, em seguida, para cada entrada com o índice 1..Nb [i] , imprimirá o valor. Por fim, imprima uma nova linha.

  • O canal final | classificará a saída

    key1: 1 4  
    key2: 2 5  
    key3: 3 6
    
  • É claro que, se forem necessários layouts diferentes, é possível criá-los a partir do exemplo acima e alterar a ordem de aninhamento dos ciclos for.

por 26.04.2015 / 13:34
0

Quando a lista de chaves é corrigida, ela pode ser transposta pelo seguinte comando:

$ pr -mt <(grep key1 in.txt | cut -f2 -d:) <(grep key2 in.txt | cut -f2 -d:) <(grep key3 in.txt | cut -f2 -d:) | sort -k1
1            2           3
4            5           6

Isso pode ser melhorado ainda mais para torná-lo mais flexível usando eval .

    
por 26.04.2015 / 17:08