執行個體:現有一樣本資料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" '
轉載于:https://www.cnblogs.com/Parallel-Life/archive/2012/10/08/2715773.html