Быстро посчитать сумму и среднее значение столбца чисел в терминале

Вопрос или проблема

Это вопрос с самопредоставленным ответом. Я уже написал ответ, но если у вас есть лучший, пожалуйста, опубликуйте его.

Я разрабатываю программу, и она выводит некоторые временные результаты:

$ homa.py
Создание экземпляра rd = NetworkInfo(): 0.0071680546
Создание экземпляра rd = NetworkInfo(): 0.0083100796
Создание экземпляра rd = NetworkInfo(): 0.0121581554
Создание экземпляра rd = NetworkInfo(): 0.0205171108
Создание экземпляра rd = NetworkInfo(): 0.0067570210
Создание экземпляра rd = NetworkInfo(): 0.0215399265
Создание экземпляра rd = NetworkInfo(): 0.0170729160
Создание экземпляра rd = NetworkInfo(): 0.0088560581
Создание экземпляра rd = NetworkInfo(): 0.0079369545
Создание экземпляра rd = NetworkInfo(): 0.0091099739
Создание экземпляра rd = NetworkInfo(): 0.0085971355
Создание экземпляра rd = NetworkInfo(): 0.0137989521
Создание экземпляра rd = NetworkInfo(): 0.0081419945
Создание экземпляра rd = NetworkInfo(): 0.0090279579
Создание экземпляра rd = NetworkInfo(): 0.0070800781
Создание экземпляра rd = NetworkInfo(): 0.0079300404
^C
homa.py refresh() закрыт по SIGTERM

Смотреть на список и получать среднее время слишком сложно.

Как я могу быстро получить среднее время?

1. Скопируйте столбец чисел с помощью прямоугольника

Удерживайте клавишу Ctrl и Левую кнопку мыши и перетащите мышь, чтобы выделить столбец чисел:

введите описание изображения здесь

Используйте правый клик “Копировать”, чтобы скопировать столбец в буфер обмена.


2. Запустите программу n

Затем введите n + Enter.

введите описание изображения здесь

Используйте правый клик “Вставить”, чтобы вставить из буфера обмена. Затем нажмите Enter, чтобы подвести итоги.


3. Установите n на своей системе

Программа n — это простой python-скрипт:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Автор: pippim.com
Лицензия: GNU GPLv3. (c) 2024
Источник: Этот репозиторий
Описание: n - Подсчет, Сумма, Минимум, Максимум и Среднее множество чисел.
"""

from __future__ import print_function  # Должно быть первым импортом
from __future__ import with_statement  # Обработка ошибок для открытия файлов
import warnings  # 'warnings' сообщает, какие команды не поддерживаются

print("n - Подсчет, Сумма, Минимум, Максимум и Среднее множество чисел.")
print("Вставьте или введите значения ('x' + <Enter> для завершения):")

n = ""  # Введенное число
nl = []  # Список чисел

while n != 'x':  # Цикл до ввода 'x'
    try:
        n = input()  # Python 3.x
    except (SyntaxError, NameError):
        n = raw_input()  # Python 2.7.12
    try:
        nl.append(float(n))
    except ValueError:
        break  # Введена буква

print()
if len(nl) == 0:
    print("Нечего делать. До свидания.")
    exit()

print("Cnt:", len(nl))
print("Tot:", sum(nl))
print("Min:", min(nl))
print("Max:", max(nl))
print("Avg:", sum(nl) / len(nl))

Скопируйте приведенный выше python-скрипт в файл с именем n. Файл n должен находиться в вашем пути. Если он не в вашем пути, вам нужно будет вызывать его с префиксом каталога. Например, вам нужно ввести /home/me/stuff/n, а не просто n.

Вам нужно установить флаг для программы n как исполняемой. Например, chmod a+x /home/me/stuff/n.


4. Резюме

n будет принимать числа, скопированные не только из gnome-terminal, но и из Libre Calc, pyCharm и многих других программ, которые могут копировать в системный буфер обмена.

Вычисление суммы или среднего для набора чисел уже долгое время было для меня проблемой. Поэтому я быстро написал этот маленький скрипт всего за несколько минут. Написание этого вопроса и ответа заняло больше времени 🙂

n должен работать на любой версии Python от 2.7.12 до 3.14, другими словами, от Ubuntu 16.04 до Ubuntu 24.10.

Вариация на ответ WinEunuuchs2Unix;

Другой способ будет следующим:

  1. Используйте настройки, чтобы привязать сочетание клавиш (в нашем примере я использовал Ctrl+Alt+I) к выполнению скрипта в, скажем, ~/bin/crunch_numbers.sh;
  2. Поместите это в ~/bin/crunch_numbers.sh:
#!/usr/bin/env bash

xclip -o |
    awk '
        NR==1 {
            min=$1
        }

        {
            tot+=$1
            $1<min && min=$1
            $1>max && max=$1
        }

        END {
            print "Cnt: "NR
            print "Tot: "tot
            print "Min: "min
            print "Max: "max
            print "Avg: "tot/NR
        }
    ' |
    xargs -0 -I{} zenity --info --text={}
  1. Копирования чисел, используя трюк, показанный в ответе WinEunuuchs2Unix;
  2. Нажатия Ctrl+Alt+I.

Вывод можно будет скопировать, выбрав его / нажав правой кнопкой мыши / кликнув на “Копировать”, если это необходимо.

Преимуществом этого метода является то, что он не требует терминала, что полезно при копировании данных из другого места (например, из Calc).

Недостатком этого метода является то, что я почти уверен, что скрипт WinEunuuchs2Unix более точен, чем мой скрипт. Если точность плавающих точек является проблемой, вам, вероятно, следует объединить этот метод с их скриптом.

с

Используйте awk:

homa.py | awk '{x+=$6; n++} END {x/n}'

Или вставьте результаты в awk.

Хотя, так как вы уже выполняете python-скрипт, было бы лучше просто добавить код в python-скрипт, чтобы вычислить текущее среднее и выводить его с каждым значением.

Ответ или решение

Чтобы быстро подсчитать сумму и среднее значение столбца чисел в терминале, вы можете воспользоваться различными подходами. В этом ответе я опишу несколько эффективных методов, позволяющих достичь этой цели.

Способ 1: Использование awk

awk – это мощный инструмент для обработки текстовых файлов и строк. Если вы запустите ваш скрипт homa.py и результат будет направлен в awk, вы сможете посчитать сумму и среднее значение строковых значений в одном из столбцов (например, в шестом столбце). Предположим, что результаты имеют вид:

Creating instance rd = NetworkInfo(): 0.0071680546
Creating instance rd = NetworkInfo(): 0.0083100796

В этом случае команда будет выглядеть следующим образом:

homa.py | awk '{x+=$6; n++} END {print "Total:", x, "Average:", x/n}'

Способ 2: Использование Python скрипта

Вы также можете написать простой Python скрипт, который прочтет столбец чисел из стандартного ввода (stdin) и выведет на экран общее количество чисел, их сумму и среднее значение. Вот пример такого скрипта:

#!/usr/bin/env python3
import sys

total = 0.0
count = 0

for line in sys.stdin:
    try:
        number = float(line.split()[-1])  # Предполагается, что число в конце строки
        total += number
        count += 1
    except ValueError:
        continue  # Игнорировать строки, которые не являются числами

if count > 0:
    print("Total:", total)
    print("Average:", total / count)
else:
    print("No valid numbers found.")

Сохраните скрипт в файл, например calculate.py, и дайте ему права на исполнение:

chmod +x calculate.py

Запустите ваш homa.py и передайте результат в calculate.py:

homa.py | ./calculate.py

Способ 3: Использование xclip и bash

Если вы хотите использовать графический интерфейс, вы можете использовать xclip для работы с буфером обмена. Вы можете написать скрипт на bash, который будет извлекать данные из буфера обмена и обрабатывать их:

#!/usr/bin/env bash

xclip -o | awk '
    NR==1 {min=$1}
    {
        tot+=$1
        if ($1 < min) min=$1
        if ($1 > max) max=$1
    }
    END {
        print "Cnt:", NR
        print "Tot:", tot
        print "Min:", min
        print "Max:", max
        print "Avg:", tot/NR
    }
'

Сохраните данный скрипт как crunch_numbers.sh, дайте ему права на исполнение и запустите после копирования чисел в буфер обмена:

chmod +x crunch_numbers.sh
./crunch_numbers.sh

Заключение

Методы, описанные выше, позволяют быстро и эффективно подсчитать суммы и средние значения столбца чисел из терминала. Выбор подхода зависит от ваших предпочтений и удобства. awk предлагает мощь и простоту, Python скрипт позволяет гибко настраивать логику, а использование графического интерфейса может быть предпочтительно для некоторых пользователей. Важно помнить, что для оптимальной работы требуется наличие установленных инструментов, таких как awk, python, и xclip.

Оцените материал
Добавить комментарий

Капча загружается...