AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1530790
Accepted
WinEunuuchs2Unix
WinEunuuchs2Unix
Asked: 2024-10-22 10:06:45 +0800 CST2024-10-22 10:06:45 +0800 CST 2024-10-22 10:06:45 +0800 CST

在终端中快速对一列数字求和并取平均值

  • 772

这是一个自答题。我已经写了一个答案,但如果你有更好的答案,请发布。

我正在开发一个程序并打印一些时间结果:

$ homa.py
Creating instance rd = NetworkInfo(): 0.0071680546
Creating instance rd = NetworkInfo(): 0.0083100796
Creating instance rd = NetworkInfo(): 0.0121581554
Creating instance rd = NetworkInfo(): 0.0205171108
Creating instance rd = NetworkInfo(): 0.0067570210
Creating instance rd = NetworkInfo(): 0.0215399265
Creating instance rd = NetworkInfo(): 0.0170729160
Creating instance rd = NetworkInfo(): 0.0088560581
Creating instance rd = NetworkInfo(): 0.0079369545
Creating instance rd = NetworkInfo(): 0.0091099739
Creating instance rd = NetworkInfo(): 0.0085971355
Creating instance rd = NetworkInfo(): 0.0137989521
Creating instance rd = NetworkInfo(): 0.0081419945
Creating instance rd = NetworkInfo(): 0.0090279579
Creating instance rd = NetworkInfo(): 0.0070800781
Creating instance rd = NetworkInfo(): 0.0079300404
^C
homa.py refresh() closed by SIGTERM

看一眼列表并得到平均时间太困难了。

如何才能快速得到平均时间?

command-line
  • 4 4 个回答
  • 804 Views

4 个回答

  • Voted
  1. user10489
    2024-10-22T12:55:44+08:002024-10-22T12:55:44+08:00

    使用 awk:

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

    或者将结果粘贴到 awk 中。

    但是,由于您已经在运行 Python 脚本,所以最好只是向 Python 脚本中添加代码来计算运行平均值并打印每个值。

    • 13
  2. Best Answer
    WinEunuuchs2Unix
    2024-10-22T10:06:45+08:002024-10-22T10:06:45+08:00

    1. 使用矩形复制数字列

    按住Ctrl键和鼠标左键并拖动鼠标以突出显示数字列:

    在此处输入图片描述

    注意:一旦您突出显示矩形,它就会被复制到剪贴板。


    2. 运行程序n

    然后输入n+ Enter。

    在此处输入图片描述

    使用鼠标中键从剪贴板粘贴。然后按下Enter来统计结果。


    3.n在您的系统上安装

    该n程序是一个简单的 Python 脚本:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    Author: pippim.com
    License: GNU GPLv3. (c) 2024
    Source: This repository
    Description: n - Count, Total, Minimum, Maximum and Average set of numbers.
    """
    
    from __future__ import print_function  # Must be first import
    from __future__ import with_statement  # Error handling for file opens
    import warnings  # 'warnings' advises which commands aren't supported
    
    print("n - Count, Total, Minimum, Maximum and Average set of numbers.")
    print("Paste or input values ('x' + <Enter> to finish):")
    
    n = ""  # Number entered
    nl = []  # Number list
    
    while n != 'x':  # Loop until 'x' entered
        try:
            n = input()  # Python 3.x
        except (SyntaxError, NameError):
            n = raw_input()  # Python 2.7.12
        try:
            nl.append(float(n))
        except ValueError:
            break  # A letter was entered
    
    print()
    if len(nl) == 0:
        print("Nothing to do. Goodbye.")
        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-terminalLibre Calc、pyCharm 和许多其他可以复制到系统剪贴板的程序中复制数字,还可以从这些程序中复制数字。

    长期以来,对一组数字进行加法或计算平均值对我来说一直是一件很麻烦的事。所以我只花了几分钟就写出了这个小脚本。写这个问答实际上花了更长的时间 :)

    n2.7.12应该可以在从到Ubuntu 16.04 的任何 Python 版本上运行3.14,换句话说,从 Ubuntu 16.04 到 Ubuntu 24.10。

    其他答案

    还有其他专门针对该问题而定制的优秀答案,但不够完善。例如,另一个程序显示从 Linux 到 Android 13 手机的 WiFi 速度输出:

    在此处输入图片描述

    python程序n在不调整awk打印位置的情况下仍能正常工作。此外,坦率地说,对于我自己来说,记住语法和参数awk是一件很困难的事情。编写脚本并根据列位置不断修改它并不能加快工作流程。

    • 5
  3. kos
    2024-10-22T12:04:28+08:002024-10-22T12:04:28+08:00

    WinEunuuchs2Unix 答案的变体;

    另一种方法是:

    1. 使用设置将键盘快捷键(在示例中我使用了++ Ctrl)与脚本的执行绑定在一起,例如;AltI~/bin/crunch_numbers.sh
    2. 将其放入~/bin/crunch_numbers.sh:
    #!/usr/bin/env bash
    
    xclip -o |
        awk '
            NR==1 {
                min=$1
                max=$1
            }
    
            {
                tot+=$1
                $1<min && min=$1
                $1>max && max=$1
            }
    
            END {
                print "Cnt: "NR+0
                print "Tot: "tot+0
                print "Min: "min+0
                print "Max: "max+0
                print "Avg: "(NR ? tot/NR : 0)
            }
        ' |
        xargs -0 -I{} zenity --info --text={}
    

    这样,工作流程就仅包括:

    1. 使用 WinEunuuchs2Unix 的答案中显示的技巧复制数字;
    2. 点击Ctrl+ Alt+ I。

    如果需要,可以通过选择/右键单击/单击“复制”来复制粘贴输出。

    这种方法的优点是它不需要终端,这在从其他地方复制东西(例如 Calc)时很有用。

    这种方法的一个缺点是,我确信WinEunuuchs2Unix 的脚本比我的脚本更准确。如果担心浮点精度,则应该将此方法与他们的脚本结合使用。

    s

    • 2
  4. Marijn
    2024-10-24T02:09:24+08:002024-10-24T02:09:24+08:00

    另一种方法是cut选择第六列并jq计算平均值。

    下面的一行程序允许您运行脚本,查看结果,并在最后计算平均值。

    python -u homa.py |tee >(trap '' INT; cut -d" " -f 6|jq -s "add / length")
    
    • python -u是在将输出发送到管道时不进行缓冲,这样您仍然可以看到stdout输入时的输出
    • |tee >(...)stdout是复制管道之间的输出和进一步的处理
    • trap '' INT是当你按下(SIGINT)时运行管道,Ctrl-C而不是在管道启动之前就将其终止
    • cut -d" " -f 6是将行分成以空格为分隔符的列,并仅显示第 6 列
    • jq -s "add / length"将所有行数相加,然后除以行数

    用于测试的Python脚本:

    import random
    import time
    
    while True:
       print(f"Creating instance rd = NetworkInfo(): {random.random()}")
       time.sleep(1)
    

    示例运行:

    $ python -u homa.py |tee >(trap '' INT; cut -d" " -f 6|jq -s "add / length")
    Creating instance rd = NetworkInfo(): 0.7142522735145004
    Creating instance rd = NetworkInfo(): 0.15049477793122568
    Creating instance rd = NetworkInfo(): 0.8481239436770016
    Creating instance rd = NetworkInfo(): 0.9042829944578701
    Creating instance rd = NetworkInfo(): 0.9699296479456453
    Creating instance rd = NetworkInfo(): 0.3519810376313339
    Creating instance rd = NetworkInfo(): 0.11973047167607598
    ^CTraceback (most recent call last):
      File "homa.py", line 6, in <module>
        time.sleep(1)
    0.5798278781190932
    KeyboardInterrupt
    

    当然您也可以用鼠标复制输出并使用更简单的命令将剪贴板内容粘贴到管道中:

    xclip -o|cut -d" " -f 6|jq -s "add / length"
    
    • 2

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve