平均Shell脚本给出错误

时间:2016-02-23 21:36:26

标签: shell

我有一个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脚本的新手。在此先感谢您的帮助。

1 个答案:

答案 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}}与*