使用awk查找另一个文件中的文件数量范围

时间:2014-03-03 11:14:01

标签: bash shell 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

我想要做的是找到第一个文件落在第二个文件的哪个范围内,然后估算该范围第二列中值的平均值。

提前致谢。

请注意

文件中的数字不一定遵循像2,4,6 ......

这样的简单模式

2 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

for r in *;  do
    awk -v r=$r -F' ' \
    'NR==1{b=$2;v=$4;next}{if(r >= b && r <= $2){m=(v+$4)/2; print m; exit}; b=$2;v=$4}' bigfile.txt
done

<强>解释

首先通过它保存第2栏和第2栏。 4成临时变量。对于所有其他通道,它检查文件名r是否在开始范围(上一个coluimn 2)和结束范围(当前列2)之间。 然后计算出平均值并打印结果。

答案 1 :(得分:1)

由于您的较小文件已排序,您可以拉出第一行和最后一行以获得最小值和最大值。然后你只需要用awk脚本来浏览bigfile来计算平均值。

因此,对于每个小文件small,您将运行脚本

awk -v start=$(head -n 1 small) -v end=$(tail -n 1 small) -f script bigfile

script可以是简单的

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
}