在AWK

2013-02-22 15 views
0

閱讀兩個文件我有一個文件,它看起來像:在AWK

1 4 
2 4 
3 5 
4 4 
5 4 
6 1 
7 1 
8 1 
9 4 
10 4 
12 1 
13 1 
14 1 
15 1 
16 2 
19 3 
20 1 
21 1 
26 1 
28 3 
24 4 
29 4 
30 1 

塔1序列號和列2是值。我想計算的特定範圍爲例如間值的總和:總和在列2其是2和7(從列1)之間的值

我由下列AWK一個襯裏來達到的這樣的:

awk '{if ($1 >= 2 && $1 <= 7) x += $2 } END {print x}' file_name #output is 20 

的問題是,我想讀其他文件2範圍:3-9,2-6,12-20等

3 9 
2 6 
12 20 

我怎麼能忽略的範圍從文件2到AWK,而不是手動用if語句輸入範圍。如何在AWK中讀取多個文件?

+0

這個問題可能與此重複: http://stackoverflow.com/questions/14984340/using-awk-從多個文件到多進程輸入 – 2014-06-13 10:02:09

回答

2

您可以通過幾種方式讀取多個文件。您可以在命令行中指定多個文件,在這種情況下,awk將讀取每個文件一次,或者您可以使用getline從文件中讀取一行。然而,在這種情況下,執行計算更加昂貴的事情可能是最簡單的,只需通過file1對file2中指定的每個範圍讀取一次,但不要使用awk來讀取範圍。喜歡的東西:

while read lower upper; do 
awk '$1 >= lower && $1 <= upper{ x += $2 } END {print x}' \ 
    lower=$lower upper=$upper file1 
done < file2 

如果你只想要一次讀文件1,你可以做更復雜的東西像(未經測試):

awk 'NR==FNR{ lo[NR]=$1; hi[NR]=$2; next } 
    { for(i in lo) if($1 >= lo[i] && $1 <= hi[i]) sum[i]+=$2 } 
    END{ for(i in b) print "sum of " lo[i] " to " hi[i] ": " sum[i] }' file2 file1 
+0

抱歉,我沒有得到正確的輸出。 – gthm 2013-02-22 21:46:39

+0

第一個程序沒有給出正確的輸出,但第二個給出。 – gthm 2013-02-22 21:53:02

2

另外一個你可以嘗試:

awk ' 
    NR==FNR{ 
    A[$1]=$2 
    next 
    } 
    { 
    t=0 
    for(i in A) if(i>=$1 && i<=$2) t+=A[i] 
    print t 
    } 
' file rangefile 

或在一行中:

awk 'NR==FNR{A[$1]=$2; next}{t=0; for(i in A) if(i>=$1 && i<=$2) t+=A[i]; print t}' file rangefile 
+0

我不明白A部分[$ 1] = $ 2 – gthm 2013-02-23 22:57:59

+2

'NR == FNR'是第一個文件被讀取的唯一時間。在那段時間裏,這個文件的值被放入數組「A」,索引爲$ 1,值爲$ 2('A [$ 1] = $ 2')。這個數組在第二部分中使用,當範圍文件被讀取時,範圍文件中的每個範圍都會枚舉數組A,這樣'i'將包含'$ 1','A [i]'將包含' $ 2'的第一個文件的行.. – Scrutinizer 2013-02-23 23:09:28

0

下面是使用awk一個辦法:

awk 'NR==FNR { a[$1]=$2; next } { for (i in a) { i+=0; if (i>=$1 && i<=$2) s+=a[i] } print s; s=0 }' file1 file2 

結果:

20 
18 
10 
+0

我不明白a [$ 1] = $ 2部分。 – gthm 2013-02-23 22:58:53

+0

@gthmgeeky:字段1('$ 1')被添加到數組(稱爲'a'),其值爲字段2('$ 2')。 HTH。 – Steve 2013-02-24 07:33:02