将小时和主题列表汇总为每小时矩阵



创建如下文件:

9 0 topic1 hour=11
9 0 topic1 hour=12
9 0 topic1 hour=13
9 0 topic1 hour=14
9 0 topic1 hour=15
9 0 topic1 hour=16
9 0 topic1 hour=17
9 0 topic1 hour=18
9 0 topic1 hour=19
9 0 topic1 hour=20
9 0 topic1 hour=21
9 0 topic1 hour=22
9 0 topic1 hour=23
9 0 topic2 hour=00
9 0 topic2 hour=01
9 0 topic2 hour=02
9 0 topic2 hour=03
9 0 topic2 hour=04
9 0 topic2 hour=05
  • 第一列是最后一列
  • 第二列为GB大小
  • 第三列是父目录
  • 最后一列是父目录
  • 中的小时目录

我希望输出的格式如下

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
topic1      00 00 00 00 00 00 00 00 00 00 09 09 09 09 09 09 09 09 09 09 09 09 09 09  
topic2      09 09 09 09 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

以表格形式表示每个父目录每小时的文件数。如果尺寸可以在那里显示,比如用逗号分隔,那就太好了。

到目前为止,这是我设法创建的:

/bin/hdfs dfs -count <hdfs_path>/year=`date --date="1 days ago" +%Y`/month=`date --date="1 days ago" +%m`/day=`date --date="1 days ago" +%d`/*|awk '{print  $2, int($3/(1024*1024*1024)+0.5), $4}'|cut -d '/' -f1,5,9|sed 's/// /g'| awk -v OFS='t' '{print $1, $2, $3,"",$4}'|while read i
do
for topic in topic1  topic2  topic3 
do
num_files=`echo $i|grep $topic|awk '{print  $1}'`
size_gb=`echo $i|grep $topic|awk '{print  $2}'`
hour=`echo $i|grep $topic|awk '{print  $4}'|cut -d "=" -f2`
done        
done

我试图解析每一行,然后格式化一个新的行。我想看看有没有其他聪明的办法

我在Linux上,所以Bash或Python可以使用。到目前为止,我成功创建的其余脚本是Bash。

如果您正在使用Awk,请使用它的功能。

awk '{ t[$3]; k[$3 ":" $4] += $1; s[$3 ":" $4] += $2; next }
END {
printf "%-11s", ""; for (h=0; h<=24; h++) printf "   %02i", h; printf "n"
for (d in t) {
printf "%-11s", d;
for (h=0; h<=24; h++)
{ hh = sprintf("%02i", h);
printf " %02i,%i", k[d ":hour=" hh], s[d ":hour=" hh]
}
printf "n"
}
}' topics

样本输出:

00   01   02   03   04   05   06   07   08   09   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
topic1      00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 09,0 00,0
topic2      09,0 09,0 09,0 09,0 09,0 09,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0 00,0

逻辑很简单;我们创建了一个关联数组k,它的键是主题和小时,第二个数组t只包含主题,这样我们就可以在以后循环遍历每个主题。例如,k["topic2:hour=13"]13小时对应的topic2值。同样,s["topic2:hour=13"]包含该主题和小时的磁盘大小。然后在最后循环遍历主题和小时数,并取出并打印这些值。

相关内容

  • 没有找到相关文章

最新更新