我有很多的文件這樣的查找範圍在另一個文件的文件號:用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
我想什麼do是找到第一個文件落入第二個文件的哪個範圍,然後估計該範圍的第二列中的值的平均值。
在此先感謝。
注意
在文件中的數字不一定遵循一個簡單的格式,如:2,4,6 ...
我有很多的文件這樣的查找範圍在另一個文件的文件號:用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
我想什麼do是找到第一個文件落入第二個文件的哪個範圍,然後估計該範圍的第二列中的值的平均值。
在此先感謝。
注意
在文件中的數字不一定遵循一個簡單的格式,如:2,4,6 ...
由於您的較小文件已排序,您可以拉出第一行和最後一行以獲取最小值和最大值。然後你只需要用awk腳本通過bigfile來計算平均值。
所以每個SMALLFILE 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
}
它的工作,你是一個天才!謝謝! – JM88
你可以嘗試以下:
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是否在開始範圍(前一個coluimn 2)和結束範圍(當前第2列)之間。 然後找出平均值並打印結果。
這是一個廣泛的問題。您應該通過發佈一些期望的輸出來重點關注它,到目前爲止您做了什麼... – fedorqui