Erros no código de script de função de média? [fechadas]

0

Eu escrevi um trecho de código (questionável) para uma função média definida pelo usuário, onde o código pega o segundo argumento da chamada da linha de comando e usa seu respectivo campo em um arquivo de entrada e encontra a média de todos os campos (em uma única coluna).

O arquivo de entrada é denominado players.data :

LBJ:1:1:1:1
KBB:2:2:2:2
KDD:3:3:3:3
PPP:4:4:4:4
LLO:5:5:5:5

Minha função deve, dependendo do segundo argumento na invocação, encontrar a média dos 5 números na 3ª, 4ª ou 5ª coluna (campo).

Sendo assim, invocação nawk -f testscript2.script players.data Row3 deve usar Row3 como ARGV[2] e, portanto, de acordo com a declaração if abaixo, some a linha 3 em players.data e, assim, a saída The average of row Row3 is 5.00

Código com erros listados abaixo:

BEGIN{FS = ":"}
{
function average(ARGV[2]){

    if(ARGV[2] == "Row3"){
            sumJan += $3
            avgJan = sumJan / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgJan
            }
    else if(ARGV[2] == "Row4"){
            sumFeb += $4;
            avgFeb = sumFeb / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgFeb
            }
    else if(ARGV[2] == "Row5"){
            sumMar += $5
            avgMar = sumMar / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgMar
            }
    else{
            print "Error: Invalid Input"
            }
    }
}
{average(ARGV[2])
}

Aqui está o resumo dos erros atuais:

nawk: a6c.script: line 8: syntax error at or near function
nawk: a6c.script: line 15: syntax error at or near else
nawk: a6c.script: line 20: syntax error at or near else 
nawk: a6c.script: line 25: syntax error at or near else
nawk: a6c.script: line 28: syntax error at or near }

Como esse código pode ser corrigido de tal forma que, quando a invocação acima é passada, a saída desejada é exibida?

    
por KMoy 02.11.2016 / 09:02

1 resposta

3

Primeiro, erros gramaticais

Você tem um { extra antes da linha com function :

BEGIN{FS = ":"}
{
function average(ARGV[2]){
   ...
}

Então deve ser:

BEGIN{FS = ":"}
function average(ARGV[2]){
   ...
}

Então, você está criando uma função que recebe um parâmetro. Esse parâmetro deve ter o escopo local da função, portanto, chamá-lo de ARGV[2] é apenas um grande mal-entendido dos escopos. Apenas use algo como:

function average(row) {

    # things with the variable row

}

E você usa ARGV[2] quando chamando a função: average(ARGV[2]) .

Então, erros de conceito

Você está usando uma função que chama em cada iteração para calcular a média. Se você quiser usar funções, use uma para acompanhar os valores e, finalmente, e, em seguida, imprima os valores.

Além disso, você está repetindo um monte de códigos em todas as suas condições if - else if - else . Observe que, por mais que você possa dizer $4 , você também pode dizer var=row e, em seguida, usar $var para usar o valor de row th :

if(ARGV[2] == "Row3"){
            sumJan += $3
            avgJan = sumJan / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgJan
            }

pode ser genérico:

sum += $row
avg = sum / 5
printf "The average of row %-10s is %6.2f", row, avgJan

No total, isso pode ser uma frase sucinta

$ awk -F: -v col=4 '{sum+=$col} END {print sum/NR}' file
3

Isso mantém uma soma do número da coluna col e finalmente divide pelo número de linhas.

    
por fedorqui 02.11.2016 / 10:25