创建如下文件:
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"]
包含该主题和小时的磁盘大小。然后在最后循环遍历主题和小时数,并取出并打印这些值。