版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/85269267
《Hadoop权威指南》读书笔记一 【updating…】
[root@server4 hadoop]# cat findMax.sh
for year in {1901,1902}
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
逐一讲解一下这个脚本是什么意思:
for year in {1901,1902}
这是一个for循环,用于遍历{}
中的值do
与done
表示一个循环体echo -ne
表示的是不输出换行符;同时使用逃逸字符basename $year .gz
表示的是,对$year
这个字符串进行格式化输出【去掉.gz
这个后缀】gunzip -c $year
表示的是查看$year
这个文件,即使是压缩文件,也不会产生任何影响。- 管道输出到
awk
中,在awk中的操作是找到如下字符串:
temp = substr($0,88,5)
在如下的行记录中找到的就是-0078
这条记录,对其进行+0操作,是为了去掉其前缀0;
q=substr($0,93,1);
这个操作就是找出每行中,从第93个字符开始的一个字符。针对如下行的值就是1
[root@server4 hadoop]# gunzip -c 1901.gz | head -1
0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999
然后awk
对temp值和q值进行判断,如果temp!=9999,并且q 是0,1,4,5,9
中的一个值,并且 temp> max
,那么执行值替换操作。
- 对文件的每行操作之后,在
END
中输出最大值。
[root@server4 hadoop]# echo 1 | awk '{q=$0; if(q !~ /[03459]/) print "a"}'
a