用awk

2014-03-03 32 views
1

我有很多的文件這樣的查找範圍在另一個文件的文件號:用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 ...

+1

這是一個廣泛的問題。您應該通過發佈一些期望的輸出來重點關注它,到目前爲止您做了什麼... – fedorqui

回答

1

由於您的較小文件已排序,您可以拉出第一行和最後一行以獲取最小值和最大值。然後你只需要用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 
} 
+0

它的工作,你是一個天才!謝謝! – JM88

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 & 4保存到臨時變量中。對於所有其他通行證,它檢查文件名r是否在開始範圍(前一個coluimn 2)和結束範圍(當前第2列)之間。 然後找出平均值並打印結果。

+0

您好Tim,感謝您的回覆,但我沒有使用該腳本獲取任何輸出。 – JM88

+0

我誤解了您的問題,我的示例將查找文件名r,然後查看它們適合您的更大文件的範圍。 – Timmah