我有一个shell脚本,应该取几个数据文件的平均值并创建一个新文件。这是脚本的副本:
#! /bin/bash
cat *thist > tmp.dat
> aves.txt
nx=10
ss=5
for i in $(seq 1 $nx)
do
a=$i*2-1
export dummy=$(awk 'NR=='$a' {print $1}' tmp.dat)
awk '$1=='$dummy' {print $5}' tmp.dat > $dummy.dat
export ave=$(awk 'NR>='$ss' {sum+=$1 b++} END {print sum/b}' $dummy.dat)
echo $dummy $ave >> aves.txt
done
rm *.dat
在读取100个.thist文件后,这就是输出文件的样子:
0 545.608
4e-07 290.349
8e-07 613.883
1.2e-06 295.655
1.6e-06 310.78
2e-06 305.01
2.4e-06 300.733
2.8e-06 308.319
3.2e-06 298.728
3.6e-06 311.961
我在第1行和第3行收到错误,因为第二列中的数字应该在250到350之间。我无法弄清楚我做错了什么。我检查了所有单个数据文件,所有第二列数都介于250和350之间。我还运行此脚本只读取10个文件,它似乎工作得很好。我很抱歉,如果这是一个愚蠢的问题,或者它是令人困惑的,我是shell脚本的新手。在此先感谢您的帮助。
答案 0 :(得分:1)
Sam,你没有发布实际的错误,但是你的行 - 1
错误是由space
和#!
之间的/bin/bash
错误引起的{1}}(删除它)。然后启用调试输出将set -x
添加为第2行(或使用bash -x scriptname
运行您的脚本,这将执行相同的操作。)发布出现的行和实际错误。
你的行 - 3
错误可能是因为没有文件匹配文件glob *thist
。如果文件名中有thist
后面的其他字符,则需要*thist*
(如果所有人都有*thist.txt
个扩展名,则需要.txt
。
下一行更准确地写为:> aves.txt
(将文件截断为0)。
最后你的算术应该是a=$((i * 2 - 1))
或不推荐,但你可以使用旧的expr
语法a=$(expr $i \* 2 - 1)
(注意:你必须逃避{{} 1}}与*
)