我有很多这样的文件:
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 ......
这样的简单模式答案 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
}