气象数据处理脚本篇(四):awk行处理

实例:现有一样本数据5899.txt,为1958.1.1-1999.12.31逐日17层数据,排列格式如下图,

要求提取其中选定的某一天的前、后各9017层数据(包括该天数据),一共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命令中不能使用行数变量,只能用awkNRNR表示从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" '

posted on 2012-10-08 20:48  Parallel Life  阅读(507)  评论(0编辑  收藏  举报

导航

友荐云推荐