在awk中添加循环

时间:2014-03-03 16:52:15

标签: bash shell for-loop awk

我遇到的问题已在之前的post中得到解决:

但是因为我有太多文件,所以在每个文件上执行awk然后使用第二个脚本来获取我想要的输出是不切实际的。

以下是我的文件的一些示例:

3 
10 
23
.
.
.
720
810
980

该脚本用于查看第一个文件中的数字在另一个文件中的位置:

2 0.004
4 0.003
6 0.034
. 
.
.
996 0.01
998 0.02
1000 0.23

找到该范围后,估算第二个文件中第二列的平均值。

以下是脚本:

awk -v start=$(head -n 1 file1) -v end=$(tail -n 1 file1) -f script file2

BEGIN {
        sum = 0;
        count = 0;
        range_start = -1;
        range_end = -1;
    }
    {
        irow = int($1)
        ival = $2 + 0.0
        if (irow >= start && end >= irow) {
                if (range_start == -1) {
                    range_start = NR;
                }
                sum = sum + ival;
                count++;
            }
        else if (irow > end) {
                if (range_end == -1) {
                    range_end = NR - 1;
                }
            }
    }
    END {
        print "start =", range_start, "end =", range_end, "mean =", sum / count
    }

我怎么能做一个循环,以便估计每个文件的平均值。我想要的输出是这样的:

Name_of_file
start = number , end = number , mean = number

提前致谢。

1 个答案:

答案 0 :(得分:2)

..将它包裹在循环中?

for f in <files>; do 
    echo "$f";
    awk -v start=$(head -n 1 "$f") -v end=$(tail -n 1 "$f") -f script file2;
done

我个人建议将它们组合在一行上(这样你的结果就是块数据而不是结果中不同行的文件名 - 在这种情况下用echo "$f"替换echo -n "$f "(不添加换行符。)

编辑:因为我认为你是语法新手,<files>可以是文件列表(file1 file2 file 3),是由glob生成的文件列表({{1} },file*,等等,或命令生成的文件列表(files/data_*.txt等)。