以下に示す2次元配列の単純なawkスクリプトを試しています:
BEGIN{
b[1][1]=0
split("5 4 3 2",b[1])
print b[1][1]
}
このコード スニペットは、gnu gawk チュートリアルでも言及されています。しかし、これを実行しようとすると、b のインデックスの構文エラーが発生しました。誰が問題が何であるかを教えてもらえますか? gnu チュートリアルでは、出力が示されています。
以下に示す2次元配列の単純なawkスクリプトを試しています:
BEGIN{
b[1][1]=0
split("5 4 3 2",b[1])
print b[1][1]
}
このコード スニペットは、gnu gawk チュートリアルでも言及されています。しかし、これを実行しようとすると、b のインデックスの構文エラーが発生しました。誰が問題が何であるかを教えてもらえますか? gnu チュートリアルでは、出力が示されています。
更新しました
通常awk
はb[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] == 5
、b[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
要素を参照してください)。
追加した
gawk 3.1.5 で確認したところ、 b[1][1]
andsplit("5 4 3 2",b[1])
表記が機能しません (予想どおり)。gawk 4.1.0も試してみましたが、両方とも動作しています! 新しいgawkb[1][1]=0
では、配列を定義しているように見えるb[1]
ので、機能しsplit("5 4 3 2",b[1])
ます。しかし、b[1,1]=0
振る舞いは異なります。古い方法で動作するためb[1]
、実際の配列ではありません (そのような要素はなく、むしろb[1 SUBSEP 1]
)。
awk --version
そのため、バージョンを確認して古い構文を使用してみてください。新しい構文にはawkが古すぎるようです。