3

以下に示す2次元配列の単純なawkスクリプトを試しています:

BEGIN{
     b[1][1]=0
     split("5 4 3 2",b[1])
     print b[1][1]
}

このコード スニペットは、gnu gawk チュートリアルでも言及されています。しかし、これを実行しようとすると、b のインデックスの構文エラーが発生しました。誰が問題が何であるかを教えてもらえますか? gnu チュートリアルでは、出力が示されています。

4

1 に答える 1

7

更新しました

通常awkb[1,1]構文を使用しますが、実際の 2D 配列ではありません。むしろ、のような要素を持つハッシュ1 SUBSEP 1です。したがって、使用for (i in b) print iすると、そのようなインデックスが得られます。のデフォルト値SUBSEPは 0x34 ですが、再定義できます。

split配列要素の定義が機能していません。bただし、通常の変数に移動して、for ループで埋めることができます。やってみよう:

BEGIN{
     #b[1,1] is automatically created if referenced, even by a read.
     split("5 4 3 2",b[1]);
     print b[1,1];
}

言う:「awk:./x.awk:5:致命的:分割:2番目の引数は配列ではありません」

次の試行:

BEGIN{
     split("5 4 3 2",a);
     b[1] = a;
     print b[1,1];
}

いいえ。エラー: 「awk: ./x.awk:5: 致命的: スカラー コンテキストで配列 `a' を使用しようとしています」

分割の結果を配列に格納し、それを 2D のような構造体にコピーするために使用できるもの:

BEGIN{
     split("5 4 3 2",a);
     for(i in a) b[1,i]=a[i];
     print b[1,1];
}

bは実際の 2D 配列ではないことに注意してください。現在、次のような 4 つの要素があります: b[1 SUBSEP 1] == 5b[1 SUBSEP 2] == 4&c。

be の値をダンプしたい場合は、次のように 2 つのループまたは 1 つのループを作成できます。

for (i in b) print i" => "b[i];

出力:

11 => 5
12 => 4
13 => 3
14 => 2

セパレーターを表示する場合は、表示されるものに設定します。

BEGIN{
     SUBSEP=":"
     split("5 4 3 2",a);
     for(i in a) b[1,i]=a[i];
     print b[1,1];
     print b[1 SUBSEP 1];
     for (i in a) print "a-"i" => "a[i];
     for (i in b) print "b-"i" => "b[i];
}

出力:

5
5
a-4 => 2
a-1 => 5
a-2 => 4
a-3 => 3
b-1:1 => 5
b-1:2 => 4
b-1:3 => 3
b-1:4 => 2

ご覧のとおり、ハッシュ要素は番号順に出力されていません。bそのように印刷されたことに驚いています。しかし、これを信用することはできません (a要素を参照してください)。

追加した

3.1.5 で確認したところ、 b[1][1]andsplit("5 4 3 2",b[1])表記が機能しません (予想どおり)。 4.1.0も試してみましたが、両方とも動作しています! 新しいb[1][1]=0では、配列を定義しているように見えるb[1]ので、機能しsplit("5 4 3 2",b[1])ます。しかし、b[1,1]=0振る舞いは異なります。古い方法で動作するためb[1]、実際の配列ではありません (そのような要素はなく、むしろb[1 SUBSEP 1])。

awk --versionそのため、バージョンを確認して古い構文を使用してみてください。新しい構文には

于 2013-04-17T05:31:34.027 に答える