Armazenando um valor de coluna ao fazer o awk group by

2

Eu tenho um arquivo de entrada com dados da seguinte forma:

1484523745 96000 2856 25059 0  
1484523745 96000 2856 25150 0  
1484523745 4864960 2856 997962 193  
1484523745 96000 2856 24923 1  
1484523745 280000 2856 61454 12  
1484523746 1179968 2856 309430 1  
1484523746 4864960 2856 1115576 300  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 997962 116  
1484523746 96000 2856 25059 0  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 1146028 211  
1484523746 4864960 2856 1115576 371  
1484523746 3184960 2856 875340 1  

O requisito é encontrar o agregado das colunas 4 e 5 com base na combinação exclusiva das colunas 2 e 3, localizando a contagem de cada combinação exclusiva e mostrando esse resultado com o valor da coluna 1 (época da época) para a primeira ocorrência de cada combinação única. Então a saída deve ficar assim:

96000 2856 150309 1 6 1484523745  
3184960 2856 875340 1 1 1484523746  
1179968 2856 309430 1 1 1484523746  
280000 2856 61454 12 1 1484523745  
4864960 2856 5373104 1191 5 1484523745  

Isso foi feito facilmente no meu Mac PC com um comando de um forro usando datamash:

datamash -W --sort -g 2,3 sum 4,5 count 5 first 1 < inputfile

No entanto, o servidor de produção do Linux no qual os arquivos de entrada estão presentes não possui datamash e o acesso à instalação é restrito. (Existem milhares de arquivos de entrada, por isso não posso enviá-los por FTP para o meu Mac). Então estou tentando conseguir o mesmo com o comando awk. Consegui o resultado necessário, exceto para imprimir o valor da coluna 1 para a primeira ocorrência da combinação exclusiva:

awk -F " " '{a[$2" "$3]+=$4; b[$2" "$3]+=$5; c[$2" "$3]++} END{for(i in a)print i, a[i], b[i], c[i]}' inputfile

Usando awk , Como armazenar o valor da coluna 1 para a primeira ocorrência de cada combinação exclusiva das colunas 2 e 3?

    
por Mohamed Aseem 22.01.2017 / 05:50

1 resposta

2

Você pode testar a presença de uma chave em uma matriz e atualizar somente a não presença:

{
    if (! ($2" "$3 in x))
        x[$2" "$3] = $1;
    a[$2" "$3]+=$4;
    b[$2" "$3]+=$5;
    c[$2" "$3]++
}
END {
    for (i in a)
        print i, a[i], b[i], c[i], x[i]
}
    
por 22.01.2017 / 06:38