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 / 问题 / 1199079
Accepted
chess_freak
chess_freak
Asked: 2019-12-29 01:31:26 +0800 CST2019-12-29 01:31:26 +0800 CST 2019-12-29 01:31:26 +0800 CST

如何从文件中计算第二个字段的平均值?

  • 772

我有一个文件,它由两个字段组成。第一个字段格式是"%FT%T"。

样本数据:

2019-01-01T00:00:00  4.8
2019-01-01T01:00:00  5.1
2019-01-01T02:00:00  5.4
2019-01-01T03:00:00  5.7
2019-01-01T04:00:00  5.8
2019-01-01T05:00:00  5.4
2019-01-01T06:00:00  5
2019-01-01T07:00:00  4.4
2019-01-01T08:00:00  3.8
2019-01-01T09:00:00  3.7
2019-01-01T10:00:00  3.8
2019-01-01T11:00:00  4.1
2019-01-01T12:00:00  5
2019-01-01T13:00:00  6.7
2019-01-01T14:00:00  8.4
2019-01-01T15:00:00  9.1
2019-01-01T16:00:00  8.6
2019-01-01T17:00:00  8.5
2019-01-01T18:00:00  8.6
2019-01-01T19:00:00  8.1
2019-01-01T20:00:00  8
2019-01-01T21:00:00  6.9
2019-01-01T22:00:00  5.6
2019-01-01T23:00:00  5.2
2019-01-02T00:00:00  5.2
2019-01-02T01:00:00  5.3
2019-01-02T02:00:00  5.8
2019-01-02T03:00:00  6
2019-01-02T04:00:00  5.7
2019-01-02T05:00:00  5.4
2019-01-02T06:00:00  5.7
2019-01-02T07:00:00  5.3
2019-01-02T08:00:00  4.8
2019-01-02T09:00:00  4.3
2019-01-02T10:00:00  3.6
2019-01-02T11:00:00  2.8
2019-01-02T12:00:00  3.2
2019-01-02T13:00:00  4.2
2019-01-02T14:00:00  4.9
2019-01-02T15:00:00  5.4
2019-01-02T16:00:00  5.9
2019-01-02T17:00:00  6.5
2019-01-02T18:00:00  6.7
2019-01-02T19:00:00  7.1
2019-01-02T20:00:00  5.7
2019-01-02T21:00:00  4.4
2019-01-02T22:00:00  4.1
2019-01-02T23:00:00  3.8
2019-01-03T00:00:00  4
2019-01-03T01:00:00  3.5
2019-01-03T02:00:00  3.6
2019-01-03T03:00:00  4
2019-01-03T04:00:00  4.2
2019-01-03T05:00:00  3.9
2019-01-03T06:00:00  3.7
2019-01-03T07:00:00  3.8
2019-01-03T08:00:00  3.7
2019-01-03T09:00:00  3.7
2019-01-03T10:00:00  4
2019-01-03T11:00:00  4.7
2019-01-03T12:00:00  5.4
2019-01-03T13:00:00  6.5
2019-01-03T14:00:00  7.6
2019-01-03T15:00:00  7.7
2019-01-03T16:00:00  7.3
2019-01-03T17:00:00  7.4
2019-01-03T18:00:00  8
2019-01-03T19:00:00  8.5
2019-01-03T20:00:00  8.1
2019-01-03T21:00:00  6.5
2019-01-03T22:00:00  5.6
2019-01-03T23:00:00  5.6

我想计算第二列的每日平均值。

输出应该如下...

01-01-2019 6.1
02-01-2019 5.1
03-01-2019 5.5
command-line bash grep date awk
  • 2 2 个回答
  • 575 Views

2 个回答

  • Voted
  1. Best Answer
    terdon
    2019-12-29T07:25:55+08:002019-12-29T07:25:55+08:00

    一个 awk 方法:

    $ awk '{ 
        date=substr($1,1,10); 
        tot[date]+=$2; 
        num[date]++
        }
        END{
            for(date in tot){
                printf "%s %.1f\n", date,tot[date]/num[date]
            }
        }' file 
    2019-01-01 6.1
    2019-01-02 5.1
    2019-01-03 5.5
    
    • 3
  2. steeldriver
    2019-12-29T06:42:11+08:002019-12-29T06:42:11+08:00

    使用米勒

    $ mlr --nidx --repifs put '
        $1 = strftime(strptime($1,"%FT%T"),"%d-%m-%Y")
      ' then stats1 -a mean -f 2 -g 1 file
    01-01-2019 6.070833
    02-01-2019 5.075000
    03-01-2019 5.458333
    

    格式化结果似乎是米勒有些缺乏的领域,所以如果你需要,我建议通过numfmtex.

    $ mlr --nidx --repifs put '
        $1 = strftime(strptime($1,"%FT%T"),"%d-%m-%Y")
      ' then stats1 -a mean -f 2 -g 1 file | numfmt --field=2 --format='%.1f'
    01-01-2019      6.1
    02-01-2019      5.1
    03-01-2019      5.5
    

    或者,使用足够新版本的 GNU awk 并使用日期的纪元时间mktime来索引sum和数组:count

    gawk '
      {
        split($1,dt,"[-T:]");
        k = mktime(sprintf("%04d %02d %02d 00 00 00", dt[1], dt[2], dt[3]));
        sum[k] += $2; count[k] += 1;
      }
      END {
        PROCINFO["sorted_in"] = "@ind_num_asc";
        for(k in count) printf "%s %.1f\n", strftime("%d-%m-%Y",k), sum[k]/count[k];
      }
    ' file
    

    另一种使用csvsql/csvformat来自基于 Python 的替代方法csvkit:

    $ csvsql -d ' ' -HS --query '
        SELECT strftime("%d-%m-%Y",date(a)) AS [Day], round(avg(b),1) AS [Avg] FROM file GROUP BY date(a)
      ' file | csvformat -T
    /usr/lib/python3/dist-packages/agate/table/from_csv.py:88: RuntimeWarning: Column names not specified. "('a', 'b')" will be used as names.
    Day Avg
    01-01-2019  6.1
    02-01-2019  5.1
    03-01-2019  5.5
    
    • 1

相关问题

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

  • 如何从命令行刻录双层 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