Hi fcolassie,
Try and adapt the scritp Avg.awk (source at bottom).
Input file
[tt]
1 12
2 22
3 32
4 42
5 10
7 10
8 10
9 20
10 30
11 10
12 5
13 5
14 12
15 5
[/tt]
Example of execution
Compute column 2 average for lines where column 1 is is less or equal 5, between 6 and 10 and greater or equal 20.
The list of lines specified by : -5,6-10,20-
[tt]
/home/jp> Avg.awk -- -5,6-10,20- points.dat
Slice: - 5 Average: 23,600000
Slice: 6 - 10 Average: 17,500000
Slice: 20 - Average: No data
/home/jp>
[tt]
Awk program
[tt][ignore]
gssjgu:/g/g00k00/gssjgu/TMP> cat Avg.awk
#!/usr/bin/awk -f
#
# File: Avg.awk
# Usage: Avg.awk -- list [file ...]
# List = list of slices values ($1) to average delimited by ","
# slice = x or x-y or x- or y-
# Input: $1 = selective value
# $2 = value to average
# Example: Average values less or equal than 10, and from 20 to 30
# Avg.awk -10,20-30 input_file
#
BEGIN {
if (ARGC == 1) exit 1;
list = ARGV[1];
ARGV[1] = "";
if (ARGC == 2) ARGV[ARGC++] = "-";
if (list == ""

list = "-";
n=split(list, sall, ","

;
for (nbs=1; nbs<=n; nbs++) {
pos = match(sall[nbs], "-"

;
if (pos == 0) {
Slices[nbs,"start"] = sall[nbs];
Slices[nbs,"end" ] = sall[nbs];
} else {
val = substr(sall[nbs],1,pos-1);
Slices[nbs,"start"] = val;
val = substr(sall[nbs],pos+1);
Slices[nbs,"end" ] = val;
}
}
Slices[0] = nbs-1;
}
function SliceIndex(val, is) {
for (is=1; is<=Slices[0]; is++) {
if (Slices[is,"start"] != "" && val < Slices[is,"start"]) continue;
if (Slices[is,"end" ] != "" && val > Slices[is,"end" ]) continue;
return is;
}
return 0;
}
{
s = SliceIndex($1);
if (s != 0) {
Slices[s,"cnt"]++;
Slices[s,"sum"] += $2;
}
}
END {
for (s=1; s<=Slices[0]; s++) {
if (Slices[s, "cnt"] != 0) {
avg = Slices[s,"sum"] / Slices[s, "cnt"];
printf "Slice: %5s - %5s Average: %f\n", Slices[s,"start"], Slices[s,"end"], avg;
} else {
printf "Slice: %5s - %5s Average: No data\n", Slices[s,"start"], Slices[s,"end"];
}
}
}
[/ignore][/tt]
Jean Pierre.