Программа Shell, которая выводит средние значения

В принципе, мне нужно написать программу оболочки, называемую avgs, которая будет считывать строки из файла с данными, где строка заголовка может быть в любой строке данных.

Подсказка: вы должны сохранить общее количество и подсчитать для каждого из последних двух столбцов и не должны включать данные из первой строки в итоговых и подсчетных числах.

Это файл с данными:

92876035 SMITZ S 15 26 95908659 CHIANG R 10 29 SID LNAME I T1/20 T2/30 92735481 BRUCE. R 16 28 93276645 YU C 17 27 91234987 MYRTH R 15 16 

Программа оболочки будет писать для вывода строки: «Средние значения – 17 и 24»,

Это то, что я пробовал, но он не работает

 count_ppl=0 total=0 while read ?? ?! do total=$((sum+b)) count_ppl=$((count_ppl+1)) done < filename avg=$(echo "scale=2;$total/$count_ppl" | bc) echo "The averages are = $avg" 

«??» а также "?!" есть рядом с «во время чтения», потому что я не знаю, что туда положить.

Я предполагаю, что это, вероятно, вычисляет один средний показатель для одного столбца, но как бы получить данные из столбцов и вычислить две средние значения.

Надеюсь, это не смущает. Извините, если это так.

Любая помощь приветствуется.

(это bash btw).

  • Как пропустить первый аргумент в скрипте
  • Создание имени базы данных MySQL с использованием переменной с даты
  • Огромная задержка в ответе скрипта при использовании SFTP с ожиданием
  • Разделение `File` и` имя каталога с пробелом 'через скрипт оболочки
  • Итерация по нескольким параметрам с пробелами в сценарии bash
  • Переменная как команда; eval vs bash -c
  • Захват jq - как правильно использовать захваченную строку
  • Как обрабатывать числа, начинающиеся с нулей, как десятичное целое число
  • One Solution collect form web for “Программа Shell, которая выводит средние значения”

    Не уверен, что вы подразумеваете под «и не должен включать данные из первой строки в итоговые и подсчеты». Вы имеете в виду, что строка «92876035 SMITZ S 15 26» должна быть исключена или просто не «суммировать» «SID LNAME I T1 / 20 T2 / 30»?

    The ?? и ?! необходимо заменить именами переменных, которые вам нужны. Последнее упомянутое имя переменной будет содержать оставшуюся часть ввода. Вам нужны последние два столбца, поэтому в вашем случае есть 5 столбцов, while read инструкция while read может быть:

     while read col1 col2 col3 col4 col5 

    Затем вам нужно проверить, является ли строка линией заголовка. В этом случае я буду тестировать слово SID в первом столбце:

     if [ "$col1" != 'SID' ] 

    и отсюда мы можем начать вычислять:

     totallines=$((totallines+1)) sumcol4=$((sumcol4+col4)) sumcol5=$((sumcol5+col5)) 

    Наконец, вы можете рассчитать средние значения, используя

     avgcol4=$(echo "scale=2; $sumcol4/$totallines"|bc) avgcol5=$(echo "scale=2; $sumcol5/$totallines"|bc) 

    чтобы обернуть это, вы можете использовать следующий скрипт:

     #!/bin/bash while read col1 col2 col3 col4 col5 do if [ "$col1" != 'SID' ] then totallines=$((totallines+1)) sumcol4=$((sumcol4+col4)) sumcol5=$((sumcol5+col5)) fi done < /path/to/inputfile avgcol4=$(echo "scale=2; $sumcol4/$totallines"|bc) avgcol5=$(echo "scale=2; $sumcol5/$totallines"|bc) printf "The averages are %s and %s" $avgcol4 $avgcol5 

    Другой способ сделать это – использовать awk :

     awk '{ if ( $1 != "SID" ) { COL4+=$4; COL5+=$5; } } END { LINES=NR-1; printf "The averages are %.2f and %.2f\n", COL4/LINES, COL5/LINES }' < /path/to/inputfile 

    Вышеупомянутая команда фильтрует строку заголовка, в противном случае суммирует столбец 4 и столбец 5, а после обработки входного файла он устанавливает переменную LINES в число записей, вычитаемых на 1 (строка заголовка) и печатает выходную строку.

    И выйдет версия bash и awk :

     The averages are 14.60 and 25.20 
    Linux и Unix - лучшая ОС в мире.