подача awk позиционных параметров - PullRequest
2 голосов
/ 15 апреля 2020

Может кто-нибудь помочь мне с сценарием, который берет список целых чисел и возвращает ответ со средним, общим, максимальным и минимальным значениями?

Мне нужно иметь возможность передавать параметры при запуске Например:

./script.sh 1 2 3 4 5

У меня есть сценарий awk, который сортирует среднее, общее и максимальное значения, мне просто нужно добавить немного, чтобы он читал аргументы - поэтому, когда я запускаю ./script.sh 1 2 3 4, он возвращает:

Average: 3
Min: 1
Max: 5
Total: 16

Любая помощь будет оценена.

Это то, что у меня уже есть:

#!/bin/bash

awk 'NR == 1 { max=$1; min=$1; sum=0 }
        { if ($1>max) max=$1; if ($1<min) min=$1; sum+=$1;}
        END {printf "Min: %d\nMax: %d\nAverage: %d\nSum %0.0f\n", min, max, sum/NR, sum}'

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 15 апреля 2020

Как это?

printf '%s\n' "$@" | awk ...
2 голосов
/ 15 апреля 2020

Ваш скрипт awk может быть проще, если вы просто отсортируете ввод:

$ cat script.sh
#!/bin/env bash

printf '%d\n' "$@" |
sort -n |
awk '
NR==1 { min=$0 }
{ sum+=$0; max=$0 }
END { printf "Average: %d\nMin: %d\nMax: %d\nTotal %0.0f\n", (NR ? sum/NR : 0), min, max, sum }
'

$ ./script.sh 1 2 3 4 5
Average: 3
Min: 1
Max: 5
Total 15
2 голосов
/ 15 апреля 2020

Не могли бы вы попробовать следующее.

printf '%s\n' "$@" | 
awk '
{
  for(i=1;i<=NF;i++){
    sum+=$i
    min=min<$i?min?min:$i:$i
    max=max>$i?max:$i
  }
  print "Avg="sum/NF ORS "min="min ORS "max="max ORS "Total="sum
}'
2 голосов
/ 15 апреля 2020

В bash вы можете сделать ту же логику c с al oop:

#!/bin/bash

if [[ $# == 0 ]]; then
    echo "No arguments provided. Expected integer args. E.g. $0 1 4 6 "
    exit 1
fi

max=$1
min=$1
avg=0
total=0

for i in $@; do
    [[ $max < $i ]] && max=$i
    [[ $min > $i ]] && min=$i
    total=$((total + i))
done

# Using bc program as bash doesn't support floating point math.
avg=$(echo "scale=6; $total/$i" | bc)
echo "max: $max, min: $min, avg: $avg, total: $total"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...