Como awk arrays são indexados por strings, você pode usar uma matriz para manter o preço total dessa marca até o momento e usar outra matriz para manter a contagem de registros vistos para essa marca.
Como "marca" é o campo 4, você pode indexar as matrizes em awk da seguinte forma:
total_price[$4] += $3 # accumulate total price for this brand
count[$4] += 1 # increment count of records for this brand
No final, percorra as teclas dos arrays e formate a saída enquanto calcula as médias.
Como POSIX awk não contém nenhuma função de classificação, canalize a saída do comando awk para o comando padrão% Unixsort.
Por favor, tente isto:
Script
#!/bin/sh
#first_name,last_name,price_paid,brand,year
#print for each brand, the average price paid
awk -F, '
NR == 1 {
next # skip header
}
{
price_paid[$4] += $3 # accumulate total price for this brand
count[$4] += 1 # increment count of records for this brand
}
END {
for (brand in price_paid) {
printf "%s,%7.2f\n", brand, price_paid[brand] / count[brand]
}
}
' < "${1:?filename required}" | sort
Anotação / explicação
-
Invoque o comando
awk, defina o Separador de campos como vírgula (,) e passe tudo entre aspas simples nesta linha e as próximas cotações simples várias linhas abaixo, como o script:awk -F, ' -
Ignorar Cabeçalho: Se o número do registro atual for 1, ignore todo o processamento na linha atual (a primeira linha) e obtenha a próxima linha de entrada:
NR == 1 { next # skip header } -
Acumular preço total por marca (isso é executado em todas as linhas):
As matrizesprice_paidecountsão indexadas pela cadeiabrand.
Adicione o preço atual pago ($3) ao total price_paid dessa marca.
Incrementar a contagem de registros para essa marca:{ price_paid[$4] += $3 # accumulate total price for this brand count[$4] += 1 # increment count of records for this brand } -
Imprimir a tabela de saída: depois que todas as entradas forem processadas, percorra as chaves (
brand) até a matrizprice_paide, para cadabrand, imprimabrande a médiaprice_paidquebrand:END { for (brand in price_paid) { printf "%s,%7.2f\n", brand, price_paid[brand] / count[brand] } } -
Encerre o argumento de script, redirecione a entrada do parâmetro filename e canalize a saída do comando
awkpara o comandosort:' < "${1:?filename required}" | sort
A aspa simples ( ' ) encerra o argumento de script como awk .
< "${1:?filename required}" redireciona a entrada padrão de awk do nome do arquivo especificado pelo primeiro parâmetro de linha de comando para o script. Se não houver nenhum parâmetro, o shell imprimirá uma mensagem de erro contendo "filename required" e sairá com status de erro.