利用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]=@lines[1](注意$i,而不能是i);
$i=0;
while(<PICK>){
	@lines=split(" ");
	$sta[$i]=@lines[0];
	$id[$i]=@lines[1];
	$a[$i]=@lines[2];
	$t0[$i]=@lines[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];			
		}
	
	
	}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_34538534/article/details/83148316