关于在 bash 中使用文件输入的家庭作业



所以基本上我被分配了这个家庭作业,我必须制作一个bash脚本,从数字文件中获取输入,并导出更大的数字,较小的数字的总和和平均值。

我试图找到一种以简单的方式做到这一点的方法,他告诉我们以 ./bashscript <数字的方式做到这一点.txt,但是我似乎不知道如何搜索它,我也无法找到一个明确的简单解决方案这个问题,我想一旦我得到一些东西,找到更大和更小的数字以及平均值应该很简单,但现在我我不知所措...>

如果我要输入一个具有以下.txt文件:345321

它应该给我更大的:5较小的:1数量:6平均:3

这不是太棘手,显示了您可以在 shell 脚本中使用 AWK 的好方法。

在 awk 逐行处理文件之前,正在执行 BEGIN 部分。在 awk 处理了整个输入文件后,将执行 END 部分。

重要的是用文件中找到的第一个数字分配 min 和 max。否则:a( 最小值,即如果文件中只有数字>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=%dn", min)
        printf ("max=%dn", max)
        printf ("avg=%dn", sum/count)
}'

用法:

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

你的意思是这样的?

#!/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: %dn" "$max" "$min" "$amount" "$avr"

用法

script.sh < a.txt

输出

the greater: 5 the smaller: 1 the amount: 6 average: 3

相关内容

最新更新