【问题标题】:Beginner Linux - .csv with Date and a value - Average value for each month初学者 Linux - 带有日期和值的 .csv - 每个月的平均值
【发布时间】:2023-02-22 01:18:44
【问题描述】:

我有一个 .csv 文件,其中包含日期 (dd/mm/yyyy) 和一个值(不总是整数,但在示例中)。

我想计算每个月的平均值。

顺便说一句,我还想将日期分成 3 列。

数据子集

01/01/2023,5
05/01/2023,8
09/01/2023,2
13/01/2023,9
16/01/2023,1
21/01/2023,-4
26/01/2023,9
29/01/2023,13
02/02/2023,6
03/02/2023,2
10/02/2023,5
17/02/2023,3
18/02/2023,21

对此很陌生,所以尝试一下,但可能会让自己感到困惑

【问题讨论】:

  • 这个和linux没有太大关系。我假设您计划使用 shbash 之类的 shell 来执行此操作,因此将其标记为 linux,对吧?请edit你的问题与那些更具体的标签,并包括你到目前为止所做的尝试。
  • 请分享您尝试过的内容,并具体说明您的需求。您在寻找 shell 脚本吗?到目前为止你写了什么?
  • 我会进行编辑
  • 一些帮助您入门的提示:使用 tr 将日期拆分为列。然后使用 GNU datamash 计算平均值。如果你要使用标准实用程序或喜欢自己完成更多工作,请将 datamash 替换为自己编写的 awk 脚本。

标签: linux


【解决方案1】:

Perl 来拯救!

perl -F'[,/]' -lne '
    $sum{ $F[1] } += $F[3];
    ++$count{ $F[1] };
    END {
        for $month (sort keys %sum) {
            print join " ", $month, $sum{$month} / $count{$month};
        }
    }' -- file.csv
  • -l 从输入中删除换行符,将它们添加到print
  • -n 为每一行输入运行代码;
  • -F 使用指定的正则表达式将每个输入行拆分为 @F 数组,这里它以逗号和斜杠拆分;
  • 代码本身填充了两个哈希表,%sum%count。顾名思义,它们包含每个月的总和和计数(为简单起见忽略年份);
  • 一旦输入耗尽,就会执行END部分。它打印月份和平均值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2013-05-26
    • 2023-03-26
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多