我有大量地震行程时间数据,格式为 4 列,如下所示:
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
我需要使用 awk 将其重新格式化为具有 6 列的不同格式,如下所示:
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
关键是原始集合的结构为[x位置,行程时间,错误,标志],我需要它变成[r,x位置,z位置(0),标志,行程时间,错误]。我对使用 awk 很陌生,我想知道是否有办法在单个脚本中完成此操作,或者是否必须分段完成。
我用我有限的 awk 经验尝试过的是:
{
printf "%s %d %d %d %f %f \n" , $1=r, $2=$1, $3=0, $4=0, $5=$2, $6=$3;
}
到目前为止,这只是输出了一系列零列,而 r 列完全丢失。
编辑: 为了澄清起见,这 2 个示例取自 2 个不同的数据集,只是为了显示格式。原始数据已经是文本文件形式,我需要更改它以适应第二个示例的格式。这包括添加列。
{
printf "%s %d %d %d %f %f \n" , $1=r, $2=$1, $3=0, $4=0, $5=$2, $6=$3;
}
printf
函数,请与用户指南中的示例进行比较
awk '{ printf "%-10s %s\n", $1, $2 }' mail-list
观察到,在修复该字段并使用表示
=
的字符串文字而不是名为 r
的变量来表示 r
持有之后,您只需说明所需的字段并且不进行任何赋值 (
file.txt
)
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
命令
awk '{printf "%s %d %d %d %f %f \n" , "r", $1, 0, 0, $2, $3}' file.txt
确实给出输出
r 0 0 0 1.000000 0.000000
r 0 0 0 0.044000 0.010000
r 0 0 0 0.075000 0.010000
r 0 0 0 0.108000 0.010000
r 0 0 0 0.117000 0.010000
r 0 0 0 0.160000 0.010000
r 0 0 0 0.197000 0.010000
您可能会发现这不是所需的输出,因为这不符合规定从 [x 位置,行程时间,错误,标志] 到 [r,x 位置,z 位置(0),标志,行程时间,错误] 的要求。这可以通过更改顺序并为每列使用正确的格式代码来完成。
awk '{printf "%s %f %f %d %f %f \n", "r", $1, 0, $4, $2, $3}' file.txt
现在输出
r 0.000000 0.000000 0 1.000000 0.000000
r 0.050000 0.000000 1 0.044000 0.010000
r 0.100000 0.000000 1 0.075000 0.010000
r 0.150000 0.000000 1 0.108000 0.010000
r 0.200000 0.000000 1 0.117000 0.010000
r 0.250000 0.000000 1 0.160000 0.010000
r 0.300000 0.000000 1 0.197000 0.010000
请注意,
%f
会在.
之后产生一定数量的数字,如果您需要其他数字,请使用例如%.03f
获取 .
之后的 3 位数字
(在 GNU Awk 5.1.0 中测试)