Программа 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).

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 
  • Как найти следующий доступный суффикс файла (file_a.txt file_b.txt и т. Д.)
  • Сценарий Bash. Создать инструмент тестирования обезьян
  • BASH: как Grep и отображает набор значений
  • Тестирование, если строка существует внутри массива строк
  • Автоматизировать рабочий процесс в оболочке
  • Использовать сохраненный ввод для скриптов
  • bash не может хранить hexvalue 0x00 в переменной
  • bash - флаги разбора и ожидаемый (необязательный) аргумент
  • Оптимизация сценария оболочки с длительным циклом работы
  • Терминал Ubuntu закрывается после запуска скрипта
  • Как написать комбинацию сценариев Java / Shell, чтобы вы могли вызывать Java-программу как удаленную команду и все же поставлять локальный файл?
  • Linux и Unix - лучшая ОС в мире.