Awk: Como percorrer um arquivo para obter todas as linhas?

0

Eu tenho um arquivo com informações:

Name   Rate   Hours



Clark  8.5    42
Sarah  18.5   19 
Joe    10     25
Paul   12     5

Eu quero calcular o pagamento total para cada funcionário.

Mas não consigo fazer meu loop funcionar porque não tenho certeza de qual i <= deve ser devido aos cabeçalhos ( Name , Rate , Hours ) no início do arquivo.

Até agora eu tenho isso:

awk 'BEGIN{
    total = 0;
}

{
    rate = $2;
    hours = $3;
        for (i = 1; i<= NR; i++)
    {
            total = rate * hours;
    }
}

END {
    print "Total = $" total;
}' testfile.dat

Agradecemos antecipadamente pela ajuda!

    
por user455555009 01.05.2017 / 01:08

2 respostas

3

Como alternativa, algo assim funciona bem e tem uma boa saída:

awk -v OFS="\t" 'NR==1{$4="total"}NR>1{$4=$2*$3}1' testfile.dat
#Output:
Name    Rate    Hours   total
Clark   8.5       42    357
Sarah   18.5      19    351.5
Joe     10        25    250
Paul    12         5    60
    
por 01.05.2017 / 01:29
2

O Awk coloca um loop implícito em torno da maior parte do script: além dos BEGIN e END blocks (e definições de função), o script é executado para cada linha em seqüência. Então, seria muito estranho ter um loop como for (i = 1; i<= NR; i++) em um script awk: quando o awk passa pela primeira linha, este executa o corpo do loop para i=1 , então o awk passa pela segunda linha e o corpo do loop é executado por i=1 e i=2 , então o awk passa pela segunda linha e o corpo do loop é executado para i=1 e i=2 e i=3 , etc.

Supondo que os nomes dos funcionários não sejam repetidos, o pagamento total de cada funcionário é simplesmente $2 * $3 . Você pode imprimir isso se quiser:

NR == 1 { print $1, $2, $3, "total" }
NR != 1 { print $1, $2, $3, $2 * $3 }

(A condição NR == 1 identifica a linha de cabeçalho.)

O pagamento total de todos os funcionários é a soma dessa expressão para cada linha, além da linha de cabeçalho. Para calcular o pagamento total de todos os funcionários, adicione o pagamento do empregado atual ao total acumulado.

NR != 1 { total += $2 * $3 }
    
por 01.05.2017 / 01:25

Tags