Outra - muito flexível - solução Python baseada em itertools.groupby
: link
Instalação
wget https://github.com/davidfoerster/group-aggregate/raw/master/group-aggregate.py
chmod +x group-aggregate.py
Uso
./group-aggregate.py [--skip N] [options...] groups aggregators...
-
groups
- Uma lista de índices de campo ou intervalos de coluna usados para agrupar registros (baseados em zero, separados por vírgulas). -
aggregators
- Um índice de campo (baseado em zero) ou intervalo de colunas, o nome de uma função de agregação e, opcionalmente, uma string de formato, todos separados por dois pontos. -
--skip N
- Ignora N linhas no início da entrada (por exemplo, linhas de cabeçalho).
Veja a saída de python3 -O group-aggregate.py --help
para mais.
Exemplos
Exemplo 1
O programa de agrupamento e agregação não pode manipular campos parciais; vamos reformatar seu conjunto de dados com outras ferramentas para contornar:
awk '{ gsub(/\//, OFS, $5); print; }' | ...
Agora, o campo de agrupamento, o ano, tem o índice 6 e o campo agregado, as temperaturas, tem o índice 7 do qual você deseja obter a média:
... | ./group-aggregate.py --skip 1 6 7:favg < data.csv
Você também pode formatar as médias de temperatura, neste exemplo para mostrar exatamente uma casa decimal :
... | ./group-aggregate.py --skip 1 6 7:favg:.1f
Exemplo 2
Em vez de separadores de campos, você também pode especificar intervalos de coluna que funcionam bem com seu formato de dados:
./group-aggregate.py --skip 1 54-58 60-:favg:.1f < data.csv
Agora você nem precisa pré-formatar os dados como no exemplo 1.
Saída
A saída dos dois comandos de exemplo é a mesma:
2012 32.2
2013 34.3