Existem versões do awk que fornecem sintaxe para agregações de computação?

4

De vez em quando eu me pego escrevendo scripts awk que calculam algumas estatísticas simples. Por exemplo, calculando um histograma, a média de um valor, o desvio padrão ou até mesmo a variância ...

Fazer isso de novo e de novo com arrays / variáveis auxiliares e for-loops na cláusula END , etc., parece um pouco tedioso e propenso a erros.

Em Dtrace , há uma sintaxe bastante impressionante para essas tarefas que eles chamam de agregações . É semelhante ao conceito / API dos Acumuladores na biblioteca Boost C ++ .

Assim, minha pergunta: há variantes do awk que fornecem conceitos / sintaxe semelhantes que permitem o cálculo conveniente e interativo de tais estatísticas?

Um exemplo imaginativo de tal sintaxe:

$ someawk '{ @time[$1] = avg($2) }' measurements.log
prog1    150
prog2    200
....

(onde a primeira coluna contém o nome do programa, a segunda o tempo de execução de uma medição, measurements.log contém várias medições para cada programa e a função agregada avg calcula a média)

    
por maxschlepzig 25.12.2012 / 20:00

1 resposta

4

O Awk foi projetado para processamento de texto simples. Se você quer mais do que isso, há um ponto em que você precisa abandonar o awk e usar uma linguagem mais capaz.

Perl é a progressão natural. Ele tem a maioria dos recursos do awk com uma sintaxe semelhante e é instalado por padrão na maioria dos sistemas unix não incorporados. Não tenho conhecimento de nenhuma biblioteca para o tipo de análise estatística que você descreve, mas há muitas bibliotecas por aí.

Para análise estatística, a língua de escolha é R . É mais fraco que o awk no processamento de texto, portanto, a menos que seus dados já estejam em um formato que o R entenda, você precisará massagear primeiro, possivelmente canalizando o awk para a R. Ver Existe uma maneira de obter o min, max, median e average de uma lista de números em um único comando? para um exemplo de uso de R que é semelhante ao seu exemplo.

    
por 26.12.2012 / 00:38