Сортировать файл на наличие дубликатов, если число больше определенного

Отвечая на ваш комментарий к вопросу :Вам не нужно $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в конце говорят: «Ваш ответ находится в верхней половине».

0
14.04.2020, 07:13
3 ответа
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'
0
19.03.2021, 02:29

Вы можете использовать начало исходного конвейера, а затем 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 печатается вместе со строкой, имеющей этот счетчик.

0
19.03.2021, 02:29

Используя заданный вами ввод, если вы хотите найти, какие символы появляются больше или равно трем раза :ведите подсчет и выведите строку в третий раз, когда она будет видна

$ 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

1
19.03.2021, 02:29

Теги

Похожие вопросы