在AWK

2014-03-03 17 views
0

添加一個循環我這是在以前post解決的問題:在AWK

但因爲我有太多的文件,它做的每個文件的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 

之後範圍爲位於第二個文件中的第二列的平均值被估計。

下面是腳本:

awk -v start=$(head -n 1 file1) -v end=$(tail -n 1 file1) -f script file2 

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 
    } 

我如何才能讓一個循環,這樣每個文件的平均估計。我希望的輸出是這樣的:

Name_of_file 
start = number , end = number , mean = number 

在此先感謝。

+0

GNU awk版本4具有'BEGINFILE'和'ENDFILE'特殊模式,可能有用。你應該做的是減少你的問題到你的索引文件和一些其他文件,並顯示你想要的輸出:http://stackoverflow.com/help/mcve –

回答

2

..將它包裹在一個循環中?

for f in <files>; do 
    echo "$f"; 
    awk -v start=$(head -n 1 "$f") -v end=$(tail -n 1 "$f") -f script file2; 
done 

個人而言,我會建議他們在同一行合併(讓你的結果是數據塊的,而不是從他們的研究結果不同的線路文件名 - 在這種情況下,與echo -n "$f "替換echo "$f"(不加。新行)

編輯:由於我想你是新來的語法,<files>可以是(file1 file2 file 3文件的列表),文件列表由水珠(file*files/data_*.txt,等等),或產生由命令生成的文件列表($(find files/ -name 'data' -type f)等)。