ファイルを解析し、各行に多次元配列を設定するAwk/Gawkスクリプトを作成しています。最初の列はピリオドで区切られた文字列で、各値は次のレベルの配列キーへの参照です。多次元awk配列を動的に生成する
data["personal"]["name"]["first"] = "John"
data["personal"]["name"]["last"] = "Doe"
data["personal"]["other"]["dob"] = "05/07/87"
data["personal"]["contact"]["phone"] = "602123456"
data["personal"]["contact"]["email"] = "[email protected]"
data["employment"]["jobs"]["1"] = Company One
data["employment"]["jobs"]["2"] = Company Two
data["employment"]["jobs"]["3"] = Company Three
:解析された後、イムは、それが同じ構造を持っていることを期待し
$ echo -e "personal.name.first\t= John\npersonal.name.last\t= Doe\npersonal.other.dob\t= 05/07/87\npersonal.contact.phone\t= 602123456\npersonal.contact.email\t= [email protected]\nemployment.jobs.1\t= Company One\nemployment.jobs.2\t= Company Two\nemployment.jobs.3\t= Company Three"
personal.name.first = John
personal.name.last = Doe
personal.other.dob = 05/07/87
personal.contact.phone = 602123456
personal.contact.email = [email protected]
employment.jobs.1 = Company One
employment.jobs.2 = Company Two
employment.jobs.3 = Company Three
:2列目は値
はここでコンテンツがどのように見えるが解析されているものの例ですさ
私が立ち往生している部分は、に動的にに多次元配列を構造化しながらキーを入力する方法です。
は、私は、最初に、私は、必要に応じて、それがうまくいくように思えたSUBSEP
変数を、使用することによって解決された同様の問題をカバーthis SO threadを見つけましたが、いくつかのテストの後に、それはarr["foo", "bar"] = "baz"
のようにのように扱われません見えます実際の配列は、arr["foo"]["bar"] = "baz"
となります。私はそれによって何を意味するかの例では、配列の任意のレベルで値をカウントすることができないだろう:arr["foo", "bar"] = "baz"; print length(arr["foo"])
は、単に印刷し0
(ゼロ)
私はおそらく右に私を指して、少し助けthis SO threadを見つけました方向。言及したスレッドでのスニペットで
:
BEGIN {
x=SUBSEP
a="Red" x "Green" x "Blue"
b="Yellow" x "Cyan" x "Purple"
Colors[1][0] = ""
Colors[2][0] = ""
split(a, Colors[1], x)
split(b, Colors[2], x)
print Colors[2][3]
}
は非常に近いですが、私が今抱えている問題は、キー(EG:Red
、Green
、など)があるという事実である指定する必要が1つ以上のキーが存在する可能性があります。
基本的に、私は.
によってそれらを分割し、a_keys
とb_keys
文字列を取り、多次元配列としてa
とb
変数を移入することができますか?...
BEGIN {
x=SUBSEP
# How can I take these strings...
a_keys = "Red.Green.Blue"
b_keys = "Yellow.Cyan.Purple"
# .. And populate the array, just as this does:
a="Red" x "Green" x "Blue"
b="Yellow" x "Cyan" x "Purple"
Colors[1][0] = ""
Colors[2][0] = ""
split(a, Colors[1], x)
split(b, Colors[2], x)
print Colors[2][3]
}
すべてのヘルプは、おかげでいただければ幸いです!
を行うことができます私は、キーは常に正確に三つのセグメントではないかもしれないことを言及するのを忘れている可能性が..しかし、これはためにスタート十分です私は一緒に働く。ありがとう! – Justin
その後、私が投稿した2番目の解決策が必要になります。明らかに - 実際のデータに複数のランクのセグメントがある場合は、サンプル入力も同じでなければなりません。 –