7

awkで疑似多次元配列を作ってみました。

# Calculate cumulative context score

BEGIN { FS=OFS="\t" }

{
        a[$2+FS+$7,$3]+=$6
}

END { for (i,j) in a
        { print i,j,a[i,j] }

}

出力:

awk: ccstscan.awk:9: END { for (i,j) in a
awk: ccstscan.awk:9:             ^ syntax error

これは、GNU awk マニュアルに記載されている内容です。

特定のインデックス シーケンスが多次元配列に存在するかどうかをテストするには、1 次元配列に使用されるのと同じ演算子 (in) を使用します。左のオペランドとして、コンマで区切られた括弧内のインデックスのシーケンス全体を記述します。

 (subscript1, subscript2, ...) in array

スクリプトを変更して、真の多次元配列を作成しようとしました:

BEGIN { FS=OFS="\t" }

{
    a[$2+FS+$7][$3]+=$6
}

END { for i in a
    {
     for j in a[i]
        { print i,j,a[i][j]
        }

    }
}

私はgawkでそれを実行しました。また、エラーが発生しました:

gawk: ccstscan.awk:6:   a[$2+FS+$7][$3]+=$6
gawk: ccstscan.awk:6:              ^ syntax error
gawk: ccstscan.awk:9: END { for i in a
gawk: ccstscan.awk:9:           ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:       ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:             ^ syntax error
gawk: ccstscan.awk:12:          { print i,j,a[i][j]
gawk: ccstscan.awk:12:                          ^ syntax error

多次元連想配列を作成およびスキャンするための正しい形式は何ですか

4

1 に答える 1

13

シミュレートされた多次元配列を使用している場合、ループは次のようになる必要があります。

  END { 
    for (ij in a) {
      split(ij,indices,SUBSEP);
      i=indices[1];
      j=indices[2];
      print i,j,a[ij]
    }
  }

この(i,j) in a構文は、特定のインデックスが配列にあるかどうかをテストする場合にのみ機能します。同様の構文を許可するforループにもかかわらず、forループでは機能しません。

真の多次元配列(配列の配列)の場合、次のように記述できます。

BEGIN { FS=OFS="\t" }

{ a[$2+FS+$7][$3]+=$6 }

END { 
  for (i in a) {
    for (j in a[i]) { 
      print i,j,a[i][j]
    }
  }
}

ただし、配列の配列はgawk 4.0でのみ追加されたため、ご使用のバージョンのgawkはそれをサポートしていない可能性があります。

別の注意:この行:

a[$2+FS+$7,$3]+=$6

$ 2、FS、および$ 7を連結しようとしているようですが、「+」は数値の加算であり、連結ではありません。次のように書く必要があります。

a[$2 FS $7,$3] += $6
于 2013-01-11T15:19:19.120 に答える