【问题标题】:Finding a range of numbers of a file in another file using awk使用 awk 在另一个文件中查找文件的一系列数字
【发布时间】:2014-03-03 11:14:00
【问题描述】:

我有很多这样的文件:

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...

【问题讨论】:

  • 这是一个广泛的问题。你应该通过发布一些想要的输出来集中注意力,到目前为止你做了什么......

标签: bash shell awk


【解决方案1】:

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

因此,对于每个小文件 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
}

【讨论】:

    【解决方案2】:

    你可以试试下面的:

    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 列和第 4 列保存到临时变量中。对于所有其他通过,它检查文件名 r 是否在开始范围(前一列 2)和结束范围(当前列 2)之间。 然后它计算出平均值并打印结果。

    【讨论】:

    • 嗨,蒂姆,感谢您的回复,但使用该脚本我没有得到任何输出。
    • 我误读了您的问题,我的示例将查找文件名 r,然后查看它们适合您更大文件的范围。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2023-03-07
    • 2019-09-03
    • 2016-10-15
    • 2019-01-04
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多