在AWK

2013-02-22 46 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