bash - 按年求和并用 0 插入缺失的条目

标签 bash awk

我有一个年月条目的报告,如下所示

201703 5
201708 10
201709 20
201710 40
201711 80
201712 100
201802 0
201803 25
201804 50
201805 50
201806 150
201807 300
201808 200
201902 10 

我需要按年份对年月条目求和,并在该特定年份的所有月份之后打印。年月可以缺少任何月份的条目。 对于那些月份,应插入虚拟值 (0)。

要求的输出:

201703 5
201704 0
201705 0
201706 0
201707 0
201708 10
201709 20
201710 40
201711 80
201712 100
2017 255
201801 0
201802 0
201803 25
201804 50
201805 50
201806 150
201807 300
201808 200
201809 0
201810 0
201811 0
201812 0
2018 775
201901 0
201902 10
201903 0
2019 10

我可以使用以下命令获取年份的摘要。

awk ' { c=substr($1,0,4); if(c!=p) { print p,s ;s=0} s=s+$2 ; p=c ; print } ' ym.dat

但是,如何为缺失的条目插入条目?。 此外,最后一个条目不应超过当前(系统时间)年月。即对于这个特定示例,不应为 201904..201905.. 等插入虚拟值。它应该仅在 201903 处停止

最佳答案

你可以使用这个awk脚本mmyy.awk:

{
   rec[$1] = $2;
   yy=substr($1, 1, 4)
   mm=substr($1, 5, 2) + 0
   ys[yy] += $2
}

NR == 1 {
   fm = mm
   fy = yy
}

END {
   for (y=fy; y<=cy; y++)
      for (m=1; m<=12; m++) {
         # print previous years sums
         if (m == 1 && y-1 in ys)
            print y-1, ys[y-1]

         if (y == fy && m < fm)
            continue;
         else if (y == cy && m > cm)
            break;

         # print year month with values or 0 if entry is missing
         k = sprintf("%d%02d", y, m)
         printf "%d%02d %d\n", y, m, (k in rec ? rec[k] : 0)
      }
      print y-1, ys[y-1]
}

然后称它为:

awk -v cy=$(date '+%Y') -v cm=$(date '+%m') -f mmyy.awk file

201703 5
201704 0
201705 0
201706 0
201707 0
201708 10
201709 20
201710 40
201711 80
201712 100
2017 255
201801 0
201802 0
201803 25
201804 50
201805 50
201806 150
201807 300
201808 200
201809 0
201810 0
201811 0
201812 0
2018 775
201901 0
201902 10
201903 0
2019 10

关于bash - 按年求和并用 0 插入缺失的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301412/

相关文章:

awk - 使用 awk 分割、划分并打印剩余行

linux - 如何解析进程中的一行并将结果用于有效的陷阱?

string - 在 bash 中将两个字符串与 "-"连字符进行比较

linux - 如何记忆上一个 bash 命令的参数?

python - 如何将一列数据(文本)包装成8列,并可以在Excel中以8列样式删除?

shell - 如何设置终端的选项卡大小(不带 "tabs"或 "expand")

linux - 有没有办法在 Unix 中删除文件中的重复 header ?

bash - 通过 sbatch 传递命令行参数

regex - 使用文件夹名称重命名文件名但保持数字相同

linux - 如何在一个制表符分隔文件中复制行并替换多个字符串