2011-10-30 18 views
1

私はしかしはるかに大きく、次のようなものであるデータセットを持っている:awkの減算レコード

5 6 9 
2 4 6 
4 5 1 

私は現在の1から各レコードにすべてのフィールドを引くことができるようにしたい、そして、一緒に店にそれらを追加します結果。例えば、ここでは最初の行(5-2)+(6-4)+(9-6)=結果から始めたいと思います。また、(5-4)+(6-5)と(9-1)。 2行目(2-4)+(4-5)+(6-1)、(2-5)+(4-6)+(6-9)など、他のすべての行についても同様に行う。データセットが大きいしかし

{ 
    if (max_nf < NF) 
      max_nf = NF 
    max_nr = NR 
    for (x = 1; x <= NF; x++) 
      vector[x, NR] = $x 
} 

END { result = ((vector[1,1] - vector[1,2]) + (vector[2,1] - vector[2,2]) + (vector[3,1] - vector[3,2])) 
} 

を、そして私が働いてもらうように見えることはできませんこれを行うためのループを、希望:次のように私はこれを手動で行うことができます。これは検出または不正な入力をインテリジェントに扱うの試みませんことを

BEGIN { getline; fields = NF+1; for (i=1; i<fields; i++) first[i] = $i; } 

    { 
     total = 0; 
     for (field = 1; field < fields; field++) 
      total += first[field] - $field; 
     printf("%d\n", total); 
    } 

注:

+0

そして、何あなたは*と*やりたいん:質問に与えられたサンプルデータについて

cat data | # generate the data in whatever fashion awk '{ for (n=1; n<=NF; n++) recsum[NR]+=$n } END { for (n=1; n<=NR; n++) for (m=n+1; m<=NR; m++) print n, m, recsum[n]-recsum[m] }' 

、これは予想される結果を生成結果?すべての値を印刷しますか? –

答えて

1

1つの明らかな可能性は、この程度のものになるだろう。

編集(編集済みの質問を合わせて):

は、あなたが依頼する質問を変更したものを考えると、あなたは明らかに、その後、配列にすべてデータを読み込み、配列の中を歩くとまで追加する必要がありますレコード間の違い。これはもはやawkの仕組みとはまったくよく似ていないので、私はすぐに何か他のものを使うことになるでしょう。とにかくawkの使用を主張するなら、基本的にすべての処理をBEGINブロックに入れ、すべての行を大きな配列に読み込んだり、それを歩いたり、すべての数式を実行したり、結果を出力したりすることができます。

+0

これを変更して次の行で同じことをする方法はありますか? – user1017243

1
awk ' 
    BEGIN { getline; split($0,v1) } 
    { 
    split($0,v2); 
    result=0; 
    for (i in v1) { 
     result += v1[i]-v2[i]; 
    } 
    print result 
    } 
' 
0

レコードの合計のみが使用されることに注意してください。したがって、2つのステップとして表示することでタスクを簡略化できます。

  1. 各レコードの合計を検索します。
  2. 合計の差を計算します。以下のようになります。

1 2 8 
1 3 10 
2 3 2