Отвечая на ваш комментарий к вопросу :Вам не нужно $count
до фактического вычисления среднего значения. А пока достаточно иметь
total=$(( total + input ))
Это добавит то, что ввел пользователь, к промежуточному итогу.
Затем можно рассчитать среднее значение, как$(( total / count ))
(примечание, так как оболочка выполняет только целочисленную арифметику, это будет целое число, см. Как выполнять целочисленные и плавающие вычисления в bash или других языках/фреймворках? ").
Прочее:
Ваша переменная $notdone
установлена в строку true
, и вы используете ее в while [ $notdone ]
. Подобные тесты для строк без кавычек ненадежны, и ваше условие цикла while
лучше записать как
while [ "$notdone" = "true" ]
Вы также должны рассмотреть возможность заключения в кавычки всех других расширений переменных в своем коде, например
if [[ "$input" -ge "$middle" ]]; then
Это особенно важно в вашем цикле ввода, иначе вы сгенерируете синтаксическую ошибку, введя что-то с пробелом посередине.
Поскольку вы используете bash
,вышесказанное также может быть написано
if (( input >= middle )); then
У вас также нет способа выйти из основного цикла, и оба echo
в конце говорят: «Ваш ответ находится в верхней половине».
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'
Вы можете использовать начало исходного конвейера, а затем awk
для фильтрации этих результатов:
sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5
awk
в конце печатает только те строки, которые соответствуют счетчикам, большим или равным 10. head
в самом конце ограничивает общий результат максимум пятью строками.
Вы можете сделать немного больше в awk
, хотя:
awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5
Сначала выполняется подсчет и отсеивание строк с низким -счетом в awk
, а затем выдаются пять лучших результатов с sort
и head
.
Подсчет выполняется путем увеличения элемента в ассоциативном массиве c
, где текущая строка ввода используется в качестве ключа.
Блок END
(, который запускается после чтения последней строки из file.log
), выполняет итерацию по всем ключам в c
, и если ключ соответствует счету, большему или равному 10, count печатается вместе со строкой, имеющей этот счетчик.
Используя заданный вами ввод, если вы хотите найти, какие символы появляются больше или равно трем раза :ведите подсчет и выведите строку в третий раз, когда она будет видна
$ awk '++count[$0] == 3' file
a
b
Направьте это на head
, чтобы ограничить вывод. Это явно не сортируется по количеству вхождений. Для этого с помощью GNU awk:
gawk -v limit=3 '
{ ++count[$0] }
END {
PROCINFO["sorted_in"] = "@val_num_desc"
n = 0
for (line in count) {
if (n == limit) break
print count[line], line
++n
}
}
' file
выходы
6 a
3 b
2 d
Ссылкаhttps://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html