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_paid
ecount
sã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_paid
e, para cadabrand
, imprimabrand
e a médiaprice_paid
quebrand
: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
awk
para 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.