Example 2-2. A program for finding the maximum recorded temperature by year from NCDC weather records
#!/usr/bin/env bash
for year in all/*
do
echo -ne `basename $year .gz`"\t"
gunzip -c $year | \
awk '{ temp = substr($0, 88, 5) + 0;
q = substr($0, 93, 1);
if (temp !=9999 && q ~ /[01459]/ && temp > max) max = temp }
END { print max }'
done
使用linux脚本打印每年最高温度,先解释一下该脚本几个注意点。
脚本目的是发现每年的最高温度,第一句for year in 后的all/*表示在名称为all的文件夹下每年度的温度信息都以 如 1990.gz 方式存在。使用gunzip方式解压并打印,对打印的内容使用awk函数进行处理,获取最大温度,单个文件处理完毕后打印max。
在上一篇中获取的数据包是这样,年度为文件夹,当中包含若干个温度详情文件。
E:\testData\1990\010010-9999-1990.gz
E:\testData\1990\010014-9999-1990.gz
E:\testData\1990\010015-9999-1990.gz
E:\testData\1990\010016-9999-1990.gz
…
从后面Appendix C的描述中得知,实际上作者对这样的数据进行了处理,因为hadoop在处理大量的小文件时无法达到很高的效率,因此作者使用hadoop将小文件合并,并且给出了代码。
我比较希望能够使用脚本处理,将所有的gz解压之后,合并成为一个文件,打包成gz的格式,这样就能完全符合之前那段脚本的处理方式。所以,脚本如下:
packyear
#! /bin/sh
# /usr/data/packyear
# unzip all gz files in data
for yeards in data/*
do
# unzip all gz files in year directory
for gzfile in $yeards/*
do
gunzip $gzfile
done
# cat all content to year file
cat $yeards/* | head -2 >> $yeards.tc
# remove year directory
rm -rf $yeards
mv $yeards.tc $yeards
# zip the tc file
gzip $yeards
done
根据实际路径改写的计算最大温度的脚本
maxyear
#! /bin/sh
# /usr/data/ maxyear
for year in /usr/data/*
do
basename $year .gz
gunzip -c $year | \
awk '{temp=substr($0, 88, 5)+0;
q=substr($0, 93, 1);
if(temp !=9999 && q ~ /[01459]/ && temp > max) max = temp}
END {print max}'
done
这个脚本最终显示出来会是:
1990
3
这样的格式。由于对数据结构的不熟悉,所以不确定显示出来的数据是否正确,但是基本的脚本和数据操作方式就是这样了。