Домашнее задание по использованию файла для ввода в bash - PullRequest
0 голосов
/ 29 мая 2019

Таким образом, в основном мне было поручено это домашнее задание, в котором я должен сделать скрипт bash, который получает данные из файла чисел и экспортирует большее число, меньшее число, их сумму и среднее значение.

Я пытался найти способ сделать это простым способом, он сказал нам сделать это в стиле ./bashscript

если бы мне нужно было ввести .txt файл, который имел: 3 4 5 3 2 1

Это должно дать мне больше: 5 меньше: 1 количество: 6 и в среднем: 3

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

ты имеешь в виду что-то подобное?

#!/bin/bash

# read data from stdin
read -r data

# read numbers into array
IFS=' ' arr=($data)

# initialize max and min with first number
max=${arr[0]}
min=${arr[0]}

# loop over all numbers
for value in "${arr[@]}"; do

   # if value greater then max, save value as max
   [[ $value > $max ]] && max="$value"

   # if value lower than min, save value as min
   [[ $value < $min ]] && min="$value"

   # sum values
   (( sum += value ))
done   

# get count of array entries
amount="${#arr[@]}"

# calculate average
(( avr = sum / amount ))

# print output
printf "the greater: %d the smaller: %d the amount: %d average: %d\n" "$max" "$min" "$amount" "$avr"

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

script.sh < a.txt

выход

the greater: 5 the smaller: 1 the amount: 6 average: 3
0 голосов
/ 29 мая 2019

Это не слишком сложно и показывает, насколько хорошо вы можете использовать AWK внутри сценария оболочки.

Секция BEGIN выполняется до того, как awk построчно обработает файл. Секция END выполняется после того, как awk обработал весь входной файл.

Важно назначить мин и макс с первым номером, найденным в файле. Иначе: а) мин будет всегда равен нулю, если в файле только цифры> 0 b) иметь допустимое число для max, даже если файл имеет только один номер / строку.

$ _ представляет фактическую строку, обрабатываемую AWK.

#! /bin/sh

# script.sh - awk script embedded into shell script

awk 'BEGIN {
        count=0
} {
        if (NR == 1) {
                min=$_
                max=$_
        }
        if ($_ < min) {
                min=$_
        }
        if ($_ > max) {
                max=$_
        }
        sum+=$_
        count++
} END {
        printf ("min=%d\n", min)
        printf ("max=%d\n", max)
        printf ("avg=%d\n", sum/count)
}'

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

$ cat datafile
2
1
4
5
3

$ chmod +x script.sh
$ ./script.sh < datafile
min=1
max=5
avg=3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...