1. 程式人生 > >利用perl指令碼實現SAC檔案頭段變數寫入

利用perl指令碼實現SAC檔案頭段變數寫入

在當前scripts資料夾下執行perl指令碼,實現對../Data資料夾內各地震事件資料夾內哥SAC波形檔案, 進行SAC頭段變數寫入. 從pick.dat中讀入第3,5 行作為a,t0, 寫入SAC頭段. 程式中使用到iddir.dat(地震資料夾及對應的地震ID).

#!/usr/bin/env perl
#作者:劉毅;郵箱:[email protected];日期:2018/10/18;

open(PICK,"<","pick.dat")||die"cannot open the file:$!\n";
open(IDDIR,"<","iddir.dat")||die"cannot open the file:$!\n";

#將pick.dat陣列的第1/3/5列分別寫入陣列id,a,t0;
#(split後lines的長度會變化,不再是行數,而是被split為幾份),$id[$i]
[email protected]
[1](注意$i,而不能是i); $i=0; while(<PICK>){ @lines=split(" "); $sta[$i][email protected][0]; $id[$i][email protected][1]; $a[$i][email protected][2]; $t0[$i][email protected][4]; $i=$i+1; } $size=$i; #將iddir.dat陣列的第1/2列分別寫入iddir陣列的第一列和第二列; $i=0; while(<IDDIR>){ @lines2=split(" "); $iddir[$i][0]=$lines2[0]; $iddir[$i][1]=$lines2[1]; #print"$iddir[$i][0] $iddir[$i][1]\n"; $i=$i+1; } $size2=$i; $iddirr=$iddir[0][1]; #目錄 $evid=$iddir[0][0]; #id $dir="../Data"; chdir $dir; print "$dir\n"; $st=0; #遍歷pick.dat中每一行; for($i=0;$i<$size;$i++){ if($evid != $id[$i]){ $node=$i; $dir="./$iddirr"; chdir $dir; #在每個地震事件資料夾中遍歷.SAC檔案 for($j=$st;$j<$node;$j++){ open(SAC, "| sac") or die "Error in opening SAC\n"; print SAC "wild echo off \n"; # print "$sta[$j]\n"; # print "$a[$j],$t0[$j]\n"; print SAC "r *.$sta[$j].* \n"; print SAC "ch a $a[$j] \n"; print SAC "ch t0 $t0[$j] \n"; print SAC "wh \n"; print SAC "q \n"; close(SAC); } chdir ".."; $st=$node; $evid=$id[$i]; for($j=0;$j<$size2;$j++){ if($iddir[$j][0] eq $evid){ $iddirr=$iddir[$j][1]; } } } }