Bash 中调用 SAC

简介

SAC 宏的功能相对比较单一,难以满足日常数据处理的需求,可以在 Bash 脚本中直接调用 SAC,这样可以利用 Bash 脚本的更多特性。

下面的例子展示了如何在 Bash 脚本中调用 SAC:

#!/bin/bash
export SAC_DISPLAY_COPYRIGHT=0

sac << EOF
fg seis
lh evla evlo
q               # 必须!
EOF

SAC 在启动时默认会显示版本信息,当用脚本多次调用 SAC 时,版本信息也会显示多次,可以通过设置 export SAC_DISPLAY_COPYRIGHT=0 的方式隐藏版本信息。

脚本中从“sac << EOF”开始到“EOF”的全部内容,都会被 Bash 传递给 SAC,SAC 会逐一解释并执行每行命令。

头段变量和黑板变量

想要在Bash脚本中引用头段变量,需要借助于 SAC 宏的语法。

#!/bin/bash
export SAC_DISPLAY_COPYRIGHT=0

sac << EOF
fg seis
ch kuser0 &1,kevnm&
setbb tmp ABC
ch kuser1 %tmp%
lh kuser0 kuser1
quit
EOF

内联函数

Bash 可以完成基本的数学运算,但是所有的运算只支持整型数据,浮点型运算或者其它更高级的数学运算需要借助 bc 或者 awk 来完成。Bash 中的变量以“$”作为标识符,Bash 会首先做变量替换再将替换后的命令传递给 SAC。

#!/bin/bash
export SAC_DISPLAY_COPYRIGHT=0

declare -i var1 var2
var1=(1+2)*3
var2=10/4
echo $var1 $var2

sac << EOF
echo on
fg seis
bp c $var2 $var1
q
EOF

本例中的变量“$var1” 和 “$var2”会首先被 SAC 解释成为1和2,因而 SAC 实际接收到的命令是“bp c 1 2”。

借助于 awksed 等工具,也可以实现部分字符串处理函数:

#!/bin/bash
export SAC_DISPLAY_COPYRIGHT=0
str1=`echo "this is long" | sed 's/long/short/'`    # 替换
str2=`echo "abcdefghi" | sed 's/def//'`             # 删除

sac << EOF
fg seis
title "$str1"
p
saveimg string.ps
q
EOF

条件判断和循环控制

Bash 具有更灵活的条件判断和循环控制功能,但由于 Bash 自身的限制,这些特性仅能在 SAC 外部使用,因而下例中需要多次调用 SAC,在某些情况下会相当耗时。

#!/bin/sh
export SAC_DISPLAY_COPYRIGHT=0

for file in *.SAC; do
   sac <<EOF
     read $file
     rmean
     rtrend
     lp co 1.0 p 2 n 4
     write ${file}.filtered
     quit
EOF
done

文件重命名

Bash 下可以借助于 awk 来实现文件重命名。下面的例子中,首先用点号对文件名做分割,$0 表示原始文件名,$7 表示用逗号分割后的第7段字符,即台网名,其他同理。最后将 awk 的输出传给 sh 去执行。

ls *.SAC | awk -F. '{printf "mv %s %s.%s.%s.%s\n", $0, $7, $8, $9, $10}' | sh