我有 100 个数据文件,每个有 1000 行,它们看起来都像这样:
0 0 0 0
1 0 1 0
2 0 1 -1
3 0 1 -2
4 1 1 -2
5 1 1 -3
6 1 0 -3
7 2 0 -3
8 2 0 -4
9 3 0 -4
10 4 0 -4
.
.
.
999 1 47 -21
1000 2 47 -21
我开发了一个脚本,它应该取第 2、3、4 列中每个值的平方,然后对它们求和并求平方根。像这样:
temp = ($t1*$t1) + ($t2*$t2) + ($t3*$t3)
calc = $calc + sqrt ($temp)
然后计算该值的平方,并对每个数据文件中的这些数字进行平均,以输出每行的平均“calc”和每行的平均“fluc”。
这些数字的含义是这样的:第一个数字是步数,接下来的三个分别是x、y和z轴上的坐标。我试图找出“步骤”从原点带我的距离,这是用公式计算的r = sqrt(x^2 + y^2 + z^2)
。接下来我需要 r 的波动,计算为f = r^4
或f = (r^2)^2
。这些必须是 100 个数据文件的平均值,这导致我:
r = r + sqrt(x^2 + y^2 + z^2)
avg = r/s
同样对于 f ,其中 s 是我计算出使用的读取数据文件的数量sum=$(ls -l *.data | wc -l)
。最后,我的最后一个计算是期望值r
和平均值之间的偏差r
,它是stddev = sqrt(fluc - (r^2)^2)
在循环外使用最终值计算的。
我创建的脚本是:
#!/bin/bash
sum=$(ls -l *.data | wc -l)
paste -d"\t" *.data | nawk -v s="$sum" '{
for(i=0;i<=s-1;i++)
{
t1 = 2+(i*4)
t2 = 3+(i*4)
t3 = 4+(i*4)
temp = ($t1*$t1) + ($t2*$t2) + ($t3*$t3)
calc = $calc + sqrt ($temp)
fluc = $fluc + ($calc*$calc)
}
stddev = sqrt(($calc^2) - ($fluc))
print $1" "calc/s" "fluc/s" "stddev
temp=0
calc=0
stddev=0
}'
不幸的是,中途我收到一个错误:
nawk: cmd. line:9: (FILENAME=- FNR=3) fatal: attempt to access field -1
我对 awk 的经验不足,无法准确找出我哪里出错了,有人能指出我正确的方向或给我一个更好的脚本吗?
预期的输出是一个文件,其中包含:
0 0 0 0
1 (calc for all 1's) (fluc for all 1's) (stddev for all 1's)
2 (calc for all 2's) (fluc for all 2's) (stddev for all 2's)
.
.
.