气象数据处理脚本篇(四):awk行处理
实例:现有一样本数据5899.txt,为1958.1.1-1999.12.31逐日17层数据,排列格式如下图,
要求提取其中选定的某一天的前、后各90天17层数据(包括该天数据),一共181天数据。
#! /bin/bash #-------------------------------------------------------------------- #Author:Qingu Jiang #Date:2012-8-26 #Purpose:Output 90 days before&after a chosen day of data # (include the chosen day). # #-------------------------------------------------------------------- #746,2906...等为指定天数 for day in 746 2906 3658 4409 4762 5512 6947 9861 10615 10932 15033 do day_before=`expr $day - 91` day_after=`expr $day + 91` #输出指定时间用于验证 echo day=,$day, day_before-1=,$day_before,day_after+1=,$day_after>>day.txt sed '1d' 5899.txt | awk 'NR> '"$day_before"' && NR< '"$day_after"'{print $0}' >> tiqu.txt done
以上脚本需要注意三点:
1.shell算术运算使用expr命令,如day_before=`expr $day - 91`,注意加反单引号得出计算结果。
2.Awk提取行数据
原来以为sed更擅长于提前行数据,但对于这个例子可以发现sed命令中不能使用行数变量,只能用awk中NR。NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。 如果批处理多个文件时,最好使用FNR代替NR。两者区别是FNR的作用域只在一个文件内.如果重新打开文件,FNR会从1开始,而awk处理完第一个文件后,NR并不会从1开始,而是继续累加 。参考文章:
http://www.letuknowit.com/topics/20120329/sample-about-awk-build-in-variable-nr-fnr-nf.html
3.Awk中使用变量时需要用单引号扩住双引号, ' "$var" '
作者:Parallel Life
出处:http://www.cnblogs.com/Parallel-Life/
同步博客:http://metman.info/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
如有问题,可以通过jiangqingu@gmail.com 联系我,非常感谢。
posted on 2012-10-08 20:48 Parallel Life 阅读(512) 评论(0) 编辑 收藏 举报