如何使用awk重新格式化一组数据?

问题描述 投票:0回答:1

我有大量地震行程时间数据,格式为 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 个不同的数据集,只是为了显示格式。原始数据已经是文本文件形式,我需要更改它以适应第二个示例的格式。这包括添加列。

sorting awk multiple-columns reformatting
1个回答
0
投票
{
printf "%s %d %d %d %f %f \n" , $1=r, $2=$1, $3=0, $4=0, $5=$2, $6=$3;
}

这不是人们应该如何使用 GNU AWK

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 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.