bash - 逐步更改 .csv 文件中的日期和数据单元格

标签 bash csv for-loop awk sed

我有一个文件,正在尝试及时为我的老板准备好,以便在明天早上 8:00 AM -8GMT 召开他的经理 session 。我想追溯更改此 .csv 文件中非连续行中的日期:(已截断)

,,,,,
,,,,,sideshow
,,,
date_bob,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
bob_available,531383,531383,531383,531383,531383,531383,531383,531383,531383,531383,531383,531383,531383,531383
bob_used,448312,448312,448312,448312,448312,448312,448312,448312,448312,448312,448312,448312,448312,448312
,,,
date_mel,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
mel_available,343537,343537,343537,343537,343537,343537,343537,343537,343537,343537,343537,343537,343537,343537
mel_used,636159,636159,636159,636159,636159,636159,636159,636159,636159,636159,636159,636159,636159,636159
,,,
date_sideshow-ws2,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
sideshow-ws2_available,936239,936239,936239,936239,936239,936239,936239,936239,936239,936239,936239,936239,936239,936239
sideshow-ws2_used,43441,43441,43441,43441,43441,43441,43441,43441,43441,43441,43441,43441,43441,43441
,,,
,,,,,simpsons
,,,
date_bart,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
bart_available,62559,62559,62559,62559,62559,62559,62559,62559,62559,62559,62559,62559,62559,62559
bart_used,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117,1135117
,,,
date_homer,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
homer_available,17799,17799,17799,17799,17799,17799,17799,17799,17799,17799,17799,17799,17799,17799
homer_used,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877,1179877
,,,
date_lisa,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14
lisa_available,3899,3899,3899,3899,3899,3899,3899,3899,3899,3899,3899,3899,3899,3899
lisa_used,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777,1193777

换句话说,一行现在显示为:

date_lisa,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14,09-17-14

最好阅读:

date_lisa,09-04-14,09-05-14,09-06-14,09-07-14,09-08-14,09-09-14,09-10-14,09-11-14,09-12-14,09-13-14,09-14-14,09-15-14,09-16-14,09-17-14

我希望一开始就减少每日可用数量,然后逐渐增加。这意味着所使用的行在开始时必须按比例变小,然后随着可用行的缩小而逐渐变大。

不是很大,不要让它看起来很明显,只是到处都是几GB。我计划以此制作数据透视表和图表,因此它必须略有不同。顺便说一句,这些数字均以 MB 为单位,因为我使用 df -m 生成它们。

如果有人可以帮助我,请先致谢。

最佳答案

以下 awk 可以满足您的需要:

awk -F, -v OFS=, '
/^date/ {
    split ($2, date, /-/); 
    for (i=2; i<=NF; i++) {
        $i = date[1] "-" sprintf ("%02d", date[2] - NF + i) "-" date[3]
    }
}
/available|used/ {
    for (i=2; i<=NF; i++) {
        $i = int (($i*i)/NF)
    }
}1' csv
  • 将输入和输出字段分隔符设置为 ,
  • 所有以日期开头的行,我们拆分第二列以查找日期部分。
  • 我们从第二列迭代到行尾,并将该列设置为新计算的开始日期,该日期基本上使用当前日期和字段总数。
  • 所有其他行保持原样,并与修改后的行一起打印。
  • 这有一个警告,即不能正确滚动不同的月份。
  • 对于数据字段,我们从第二列迭代到行尾,并进行计算,使它们逐渐大于前一列,以匹配最后一个字段的原始值。

关于bash - 逐步更改 .csv 文件中的日期和数据单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25904136/

相关文章:

java - 意外的无限字节循环

arrays - Bash 参数扩展、间接引用和后台

linux - 将 bash 参数中的多个不同内容添加到名为的 sql 脚本中的变量集

linux - 如何使用文件名中的日期查找早于一个月的文件?

python - 复制 csv 文件时字符串到字节转换错误

mysql - 将Excel数据矩阵导入MySQL数据库

python - for/while/print *things* 在 python 中如何工作?

linux - sed/awk - 删除包含多个模式的多行 block

linux - 使用脚本中设置的管道命令的默认值运行 bash 脚本

python - Pandas - 合并两个数据帧后创建多值字段