0

次のようなファイルがあります。

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 は値です。たとえば、特定の範囲内の値の合計を計算したい: (column1 から) 2 から 7 の間の column2 の値を合計する

私は次の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

if ステートメントで範囲を手動で入力する代わりに、file2 から AWK に範囲を渡すにはどうすればよいですか。AWK で複数のファイルを読み取る方法は?

4

3 に答える 3

3

あなたが試すことができる別のもの:

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

または1行で:

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
于 2013-02-22T21:46:09.380 に答える
2

いくつかの方法で複数のファイルを読み取ることができます。コマンドラインで複数のファイルを指定できます。その場合、awkはそれぞれを1回読み取るかgetline、ファイルから1行を読み取るために使用できます。ただし、この場合、計算コストの高い処理を実行し、file2で指定された範囲ごとにfile1を1回読み取るのが最も簡単な場合がありますが、範囲の読み取りにawkを使用しないでください。何かのようなもの:

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

file1を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
于 2013-02-22T21:32:20.310 に答える
0

を使用する 1 つの方法を次に示し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
于 2013-02-23T12:10:58.097 に答える