《Hadoop权威指南》读书笔记一

版权声明:如若转载,请联系作者。 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循环,用于遍历{}中的值
  • dodone 表示一个循环体
  • 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

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/85269267
今日推荐