因此,基本上,我已被分配了此作业,在该作业中,我必须制作一个bash脚本,该脚本从数字文件中获取输入,并输出较大的数字,较小的数字总和和平均值。
我试图找到一种简单的方法,他告诉我们以./bashscript 如果我要输入一个具有以下内容的.txt文件:
3
4
5
3
2
1 应该给我更大的价值:5
较小:1
数量:6
平均:3
答案 0 :(得分:0)
这不太棘手,它说明了如何在Shell脚本中很好地使用AWK。
在awk逐行处理文件之前,将执行BEGIN部分。 在awk处理完整个输入文件后,将执行END部分。
重要的是给min和max分配文件中找到的第一个数字。除此以外: a)最小值,即如果文件中只有数字> 0,则始终为零 b)即使文件只有一个数字/行,也要有一个最大的有效数字。
$ _代表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
答案 1 :(得分:0)
您的意思是这样的吗?
#!/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