por que o Bash não adicionará minhas variáveis juntas?

0

Estou escrevendo um script de shell para calcular as médias de números de um arquivo, mas por algum motivo o bash não está adicionando meus números juntos.

Eu tentei diversas maneiras de formatar a soma = 'expr $ sum + $ num', mas continue recebendo erros.

while read line
do  
    sum=0
    count=0
    average=0
    median=0

    #read each line, sort it and put it into tempRows file
    echo "$line" >> $tempRow
    sort $tempRow

    #add each number to the sum for avg calculation
    for i in $tempRow
        do
        num=$i
        count='expr $count + 1'
        echo "count: $count"
        sum='expr $sum + $num'
        echo "sum: $sum"    
        done

    #perform and print average calc at the end of each line
    average='expr $sum / $count'

    echo -e "$average\t"

    rm -f $tempRow
done < $tempFile

Atualmente, esse código me fornece a seguinte saída antes de sair

count: 1
expr:non-numeric argument
sum:
expr:syntax error

Eu estou classificando cada linha antes de adicionar ao tempRow para um cálculo mediano posterior Um arquivo de amostra conteria várias linhas e colunas de números inteiros e eu imprimiria cada média de linhas e mediana

    
por Sana 31.01.2017 / 00:54

2 respostas

3

Execute bash -x myscript . Isso lhe dará um traço da execução que deve esclarecer os problemas.

Seu principal problema é

for i in $tempRow

A variável $tempRow contém um nome de arquivo. Supondo que o nome do arquivo não contenha nenhum espaço em branco ou caracteres curinga, $tempRow se expande para uma lista de uma palavra que é esse nome de arquivo. Portanto, o corpo do loop for executado uma vez, com i definido para o nome do arquivo.

Parece que você deseja repetir as linhas do arquivo. Use while read para isso. Ou melhor, while IFS= read -r i; do … .

Algumas dicas adicionais:

por 31.01.2017 / 01:10
0

Você deve fornecer mais algumas informações, como o conteúdo do arquivo para o qual $ tempFile aponta. Então eu seria capaz de ajudar mais.

cat $tempFile|while read line
do  
  sum=0
  count=0
  average=0
  median=0

  #read each line, sort it and put it into tempRows file
  echo "$line" >> $tempRow
  sort $tempRow

  #add each number to the sum for avg calculation
  for i in $(cat $tempRow)
  do
    count+=1
    echo "count: $count"
    sum+=$i
    echo "sum: $sum"    
  done

  #perform and print average calc at the end of each line
  average=$((sum / count))

  echo "$average"

  rm -f $tempRow
done
    
por 31.01.2017 / 01:03