awkを使用して2D配列の複数の数値を合計する方法

awkを使用して2D配列の複数の数値を合計する方法

次のようにファイルの数を合計する必要があります。

       column1  column2 column3
 row1   a(1,1)   a(1,2)  a(1,3)
 row2   a(2,1)   a(2,2)  a(2,3)
 row3   a(3,1)   a(3,2)  a(3,3)
 row4   a(4,1)   a(4,2)  a(4,3)
 row5   a(5,1)   a(5,2)  a(5,3)
 row6   a(6,1)   a(6,2)  a(6,3)
 row7   a(7,1)   a(7,2)  a(7,3)
 row8   a(8,1)   a(8,2)  a(8,3)
 row9   a(9,1)   a(9,2)  a(9,3)
 row10  a(10,1)  a(10,2) a(10,3)
 row11  a(11,1)  a(11,2) a(11,3)
 row12  a(12,1)  a(12,2) a(12,3)


       column4  column5 column6
 row1  b(1,1)   b(1,2)  b(1,3)
 row2  b(2,1)   b(2,2)  b(2,3)
 row3  b(3,1)   b(3,2)  b(3,3)
 row4  b(4,1)   b(4,2)  b(4,3)
 row5  b(5,1)   b(5,2)  b(5,3)
 row6  b(6,1)   b(6,2)  b(6,3)
 row7  b(7,1)   b(7,2)  b(7,3)
 row8  b(8,1)   b(8,2)  b(8,3)
 row9  b(9,1)   b(9,2)  b(9,3)
 row10 b(10,1)  b(10,2) b(10,3)
 row11 b(11,1)  b(11,2) b(11,3)
 row12 b(12,1)  b(12,2) b(12,3)

出力は次のようになります。

  column1    a(1,1)+a(2,1)+a(5,1)+a(6,1)+a(7,1)+a(8,1)+a(11,1)      a(3,1)+a(4,1)+a(9,1)+a(10,1)+a(12,1)  
  column2    a(1,2)+a(2,2)+a(5,2)+a(6,2)+a(7,2)+a(8,2)+a(11,2)      a(3,2)+a(4,2)+a(9,2)+a(10,2)+a(12,2) 
  column3    a(1,3)+a(2,3)+a(5,3)+a(6,3)+a(7,3)+a(8,3)+a(11,3)      a(3,3)+a(4,3)+a(9,3)+a(10,3)+a(12,3)
  column4    b(1,1)+b(2,1)+b(5,1)+b(6,1)+b(7,1)+b(8,1)+b(11,1)      b(3,1)+b(4,1)+b(9,1)+b(10,1)+b(12,1)
  column5    b(1,2)+b(2,2)+b(5,2)+b(6,2)+b(7,2)+b(8,2)+b(11,2)      b(3,2)+b(4,2)+b(9,2)+b(10,2)+b(12,2)
  column6    b(1,3)+b(2,3)+b(5,3)+b(6,3)+b(7,3)+b(8,3)+b(11,3)      b(3,3)+b(4,3)+b(9,3)+b(10,3)+b(12,3)

同様のことを行う方法はありますが、4行でのみ機能します。このスクリプトを変更する必要があります。

sed 's/row[1-9]//;/^$/d' file |    #elimina os rows
pr -2t -w 1000| 
awk 'NR==1{$1=$1; print; next} 
 !(NR%2){split($0,a); next}          
        {for(i=1;i<=NF;i++) $i+=a[i]}1' | 
 tr ' ' '\n' | 
 pr -3t 

合計を計算する際の注意点

   $ tr -d 'ab(,)' < file > filenums

awk部分で修正が必要だと思いますが、どうすればいいかわかりません。

ベストアンサー1

これはあなたの質問に対する文字通りの答えですawk。以下を使用してください。

awk '
  /column4/ { c = 3 }   # add three for the second set of columns
  /row/ {
    row = substr($1,4)  # extract the row number
    col[1+c,row] = $2   # extract column 1 or 4, store in hash
    col[2+c,row] = $3   # extract column 2 or 5, store in hash
    col[3+c,row] = $4   # extract column 3 or 6, store in hash
  }
  END {
    split("1 2 5 6 7 8 11", out1) # create an array of first set of rows
    split("3 4 9 10 12", out2)    # create an array of second set of rows

    for (c = 1; c <= 6; c++) {
      out = sprintf("  column%d    %s", c, col[c,1]) # title and first row
      for (r = 2; r <= 7; r++) {
        out = out "+" col[c,out1[r]]                 # the rest of the first set
      }
      out = out "      " col[c,3]                    # spaces, 1st row of 2nd set
      for (r = 2; r <= 5; r++) {
        out = out "+" col[c,out2[r]]                 # the rest of the 2nd set
      }
      print out
    }
  }
' file

この出力は次のようになります。

  column1    a(1,1)+a(2,1)+a(5,1)+a(6,1)+a(7,1)+a(8,1)+a(11,1)      a(3,1)+a(4,1)+a(9,1)+a(10,1)+a(12,1)
  column2    a(1,2)+a(2,2)+a(5,2)+a(6,2)+a(7,2)+a(8,2)+a(11,2)      a(3,2)+a(4,2)+a(9,2)+a(10,2)+a(12,2)
  column3    a(1,3)+a(2,3)+a(5,3)+a(6,3)+a(7,3)+a(8,3)+a(11,3)      a(3,3)+a(4,3)+a(9,3)+a(10,3)+a(12,3)
  column4    b(1,1)+b(2,1)+b(5,1)+b(6,1)+b(7,1)+b(8,1)+b(11,1)      b(3,1)+b(4,1)+b(9,1)+b(10,1)+b(12,1)
  column5    b(1,2)+b(2,2)+b(5,2)+b(6,2)+b(7,2)+b(8,2)+b(11,2)      b(3,2)+b(4,2)+b(9,2)+b(10,2)+b(12,2)
  column6    b(1,3)+b(2,3)+b(5,3)+b(6,3)+b(7,3)+b(8,3)+b(11,3)      b(3,3)+b(4,3)+b(9,3)+b(10,3)+b(12,3)

しかし「合計計算」を使うと言われましたがtr -d 'ab(,)'、どういう意味なのかわかりません。このコマンドはユーザーが指定した文字のみを削除するため、最初の列1の出力になります11+21+51+61+71+81+111。もしそうなら407、この場合でも数字を一緒に追加して印刷しますか?

私は単にa()とb()が関数であり、どこかで評価すると仮定します。そうでなければすべてをawk

おすすめ記事