如何使用awk重新格式化地震走时数据?
使用AWK转换地震走时数据格式
原始数据格式
原始数据为4列文本,结构是[x位置, 走时, 误差, 标志]:
0.000 1.000 0.000 0 0.050 0.044 0.010 1 0.100 0.075 0.010 1 0.150 0.108 0.010 1 0.200 0.117 0.010 1 0.250 0.160 0.010 1 0.300 0.197 0.010 1
目标输出格式
需要转换为6列格式,结构是[r, x位置, z位置(固定为0), 标志, 走时, 误差],示例如下:
3 s 1 2.9901 38 r 3 0 0 2.27046 0.01 r 5 0 0 2.53864 0.01 r 7 0 0 2.66227 0.01 r 9 0 0 2.82365 0.01 r 11 0 0 3.23862 0.01 r 13 0 0 3.52581 0.01 r 15 0 0 4.15172 0.01
注:两个示例来自不同数据集,仅作格式参考
问题与尝试
刚接触AWK,想确认是否可以用单脚本完成转换,无需分步处理。尝试了以下脚本,但输出全是零列且缺少r标识:
{ printf "%s %d %d %d %f %f \n" , $1=r, $2=$1, $3=0, $4=0, $5=$2, $6=$3; }
解决方案
完全可以用单AWK脚本完成转换,先纠正你脚本里的错误:
$1=r是错误的赋值操作,应该直接输出字符串"r"- 不需要重新赋值给
$2/$3等变量,直接使用原始列的$1-$4对应到目标列位置 - 注意数据类型匹配,比如
x位置是浮点数,不要用%d格式化
正确脚本
# 如果需要开头的数字(比如示例中的3),若为固定值可直接在BEGIN块打印 # BEGIN { print 3 } { # 跳过空行 if (NF == 0) next # 按目标格式输出:r + x位置 + 固定0 + 标志 + 走时 + 误差 printf "r %.3f 0 %d %.3f %.3f\n", $1, $4, $2, $3 }
脚本说明
NF == 0用来跳过原始数据中的空行%.3f保留3位小数,和原始数据格式匹配,可根据需求调整精度- 如果目标格式开头需要输出特定数字(比如示例的第一行),直接在
BEGIN块中添加print 数字即可,比如原始数据有7行有效数据,若需要输出6就写BEGIN { print 6 }
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

