在bash中将kB和GB转换为MB

在bash中将kB和GB转换为MB,bash,awk,sed,Bash,Awk,Sed,我使用awk和sed来获取表中分区的列表及其大小,我想用它们来计算各个表的每日增量。这是我的输出,现在我正在努力将所有的大小转换为MBs 根据“MB”或“GB”字符串匹配第二个字段中的数字并将其相乘的最佳bash方法是什么 所需的输出将是: 2017061505,482.46MB,hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061505, 20

我使用awk和sed来获取表中分区的列表及其大小,我想用它们来计算各个表的每日增量。这是我的输出,现在我正在努力将所有的大小转换为MBs

根据“MB”或“GB”字符串匹配第二个字段中的数字并将其相乘的最佳bash方法是什么

所需的输出将是:

2017061505,482.46MB,hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061505,
2017061506,722.58MB,hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061506,
2017061507,1030MB,hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061507,
2017061508,1250MB,hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061508,
awk解决方案:

awk 'BEGIN{ FS=OFS="," }{ s=substr($2,1,length($2)-1); u=substr($2,length($2)-1); 
     if(u=="KB") $2=(s/1024)"MB"; else if(u=="GB") $2=(s*1024)"MB" }1' yourfile
输出:

2017061505,482.46MB,hdfs://user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061505,
2017061505,722.58MB,hdfs://user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061506,
2017061507,1054.72MB,hdfs://user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061507,
2017061507,1280MB,hdfs://user/hive/warehouse/cz_prd_ntw_op.db/diameter__24_/pr_comp_ver=0/pr_start_time=2017061508,


注:信息学中的标称单位值为1024awk中的简单解:

awk '$2 ~ /[0-9\.]+GB/ { $2 = int($2 * 1024) "MB" } 1' FS="," OFS="," table.txt

可以为kB转换添加另一个规则(只需除以1024)。

没有其他方法生成输出吗?好的,发布预期结果output@user37421这是Impala中“show partitions”查询的输出,不过我可能可以将其格式化得更好。我在想,最后我只需对每个表的第二个字段求和,就可以得到result@k_mishap如果您只需要以兆字节为单位的总和,您可以使用bc<代码>awk-F,'{sub(“MB”),'',$2)| sub(“kB”),“/1024”,$2)| sub(“GB”,“*1024”,$2);printf$2“+”}END{print 0}'$The|u文件| bc
awk '$2 ~ /[0-9\.]+GB/ { $2 = int($2 * 1024) "MB" } 1' FS="," OFS="," table.txt