Нужна помощь, чтобы найти средние, минимальные и максимальные значения в сценарии оболочки из текстового файла (снова) - PullRequest
0 голосов
/ 05 апреля 2020

Это обновление к вопросу, который я опубликовал ранее. Я немного углубился в это, но мне нужна помощь с новой проблемой.

Я сейчас работаю над сценарием оболочки. Мне нужно l oop через текстовый файл, взять текст из него, найти среднее число, максимальное число и минимальное число в каждой строке чисел, а затем распечатать их в виде диаграммы с названием каждой строки. Это текстовый файл:

Experiment1 9 8 1 2 9 0 2 3 4 5
collect1 83 39 84 2 1 3 0 9
jump1 82 -1 9 26 8 9
exp2 22 0 7 1 0 7 3 2
jump2 88 7 6 5
taker1 5 5 44 2 3

Это мой код до сих пор. Он должен работать, но он не будет выполнять никаких расчетов. Первый l oop захватывает строку текста, второй l oop отделяет имя от чисел, эти две работы. Затем l oop берет числа и выполняет вычисления. Он продолжает давать мне сообщение об ошибке «expr: нецелочисленный аргумент», почему он это делает? Я не должен

#!/bin/bash


while read line
do 
echo $line | while read first second 
  do
    echo $first
    echo $second
    sum=0
    max=0
    min=0
    len=0
    for arg in $second
    do
      sum=`expr $sum + $arg`
      if [ $min > $arg ]
      then
        set min=$arg
      fi
      if [ $max < $arg ]
      then
        set max=$arg
      fi
      len=`expr $len + 1`
    done
    avg=`expr $sum / $len`
    echo $avg
    echo $min
    echo $max
  done
done < mystats.txt

Это желаемый вывод при вводе "bash statcal c. sh -s name mystats.txt"

Experiment Name Average Max Min
collect1        27      84  0
exp2            5       22  0
Experiment1     3       9   0
jump1           21      82  -1
jump2           31      88  5
taker1          13      44  2

1 Ответ

0 голосов
/ 06 апреля 2020

Использование awk

awk '{if (NR==1)print "Experiment Name Average Max Min"; min=$2;max=$2;for(i=2;i<=NF;i++) {a[$1]=a[$1]+$i; if (min<$i) min=$i; if(max>$i)max=$i} print $1, int(a[$1]/(NF-1)),min,max}'

Демо:

$awk '{if (NR==1)print "Experiment Name Average Max Min"; min=$2;max=$2;for(i=2;i<=NF;i++) {a[$1]=a[$1]+$i; if (min<$i) min=$i; if(max>$i)max=$i} print $1, int(a[$1]/(NF-1)),min,max}'  file.txt | column -t
Experiment   Name  Average  Max  Min
Experiment1  4     9        0
collect1     27    84       0
jump1        22    82       -1
exp2         5     22       0
jump2        26    88       5
taker1       11    44       2


$cat file.txt 
Experiment1 9 8 1 2 9 0 2 3 4 5
collect1 83 39 84 2 1 3 0 9
jump1 82 -1 9 26 8 9
exp2 22 0 7 1 0 7 3 2
jump2 88 7 6 5
taker1 5 5 44 2 3
$

...