2011-06-29 13 views
1

私は、次のテストスクリプトこのawkスクリプトが期待どおりに動作しないのはなぜですか?

/^[^a-zA-Z0-9]/ { 
    DATEd[$3] = $1 
    } 
    END { 
     print "  \"data\": [" 
     for (i = 0 ; i <= 5; i ++) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

を持っており、

2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 

このテキストファイルからの読み取りしかし、それは、私はそれが欲しいものをプリントアウトしていない、私はそれが

を印刷したいです
"data": [ 
     [0, "2011-01-22"], 
     [1, "2011-01-22"], 
     [2, "2011-01-22"], 
     [3, "2011-01-22"], 
     [4, "2011-01-22"], 
     [5, "2011-01-22"], 
    ] 

それは実際にのみ

"data": [ 
    [0, ""], 
    [1, ""], 
    [2, ""], 
    [3, ""], 
    [4, ""], 
    [5, ""], 
] 
をプリントアウトしています

なぜ "DATEd [$ 3] = $ 1"は空ですか?

また、配列の長さを確認するにはどうすればよいですか?この場合、 DATEd.lengthは機能しません。

おかげ

EDIT_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___

ので@Fredrikの助けと@geekosaurから、私はいくつかの最後の質問になりました、これでどこかに出ている

1)このスクリプトは、今、この

/[a-zA-Z0-9]/ { 
    DATEd[NR-1] = $1 
    } 
    END { 
     print "  \"data\": [" 

     for (i in DATEd) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

のように見え、次のような出力を提供します

"data": [ 
    [4, "2011-01-26"], 
    [5, "2011-01-27"], 
    [6, "2011-01-28"], 
    [0, "2011-01-22"], 
    [1, "2011-01-23"], 
    [2, "2011-01-24"], 
    [3, "2011-01-25"], 
] 

しかし、私はそれがこの

"data": [ 
[0, "2011-01-22"], 
[1, "2011-01-23"], 
[2, "2011-01-24"], 
[3, "2011-01-25"], 
[4, "2011-01-26"], 
[5, "2011-01-27"], 
[6, "2011-01-28"] 
] 

すなわち見えるようにしたいがソートされ、最終クロージング 『]』文字の前に最後の「」文字を削除します。これは簡単な方法で逃げることが可能ですか?=)

感謝=)

EDIT 3最終Outcome_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____スタートとして

@geekosaurと@Fredrik貢献者=の組み合わせを使用し

{ 
    DATEd[NR-1] = $1; len++ 
} 
    END { 
     print "  \"data\": [" 

     #for (i in DATEd) { 
     for (i = 0 ; i <= len-1; i ++) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

答えて

0

、あなたの正規表現は間違っている、/^[^a-zA-Z0-9]/は、行の先頭にマッチしてないように意味その後に手紙または番号が続きます。どの行もその設定を持っていないので、配列DATeは空です。

第二に、あなたの配列は0-5でインデックス化されていませんが、配列の長さを取得する機能であり内蔵されていないされて

(あなたが正規表現を修正した場合)、代わりに$ 3の含有量は、それはに簡単ですそれを実装する。

配列例

function array_length(a) { 
    for (i in a) n++ 
    return n 
} 

{ 
    DATEd[NR] = $1 
} 
END { 
    for (i in DATEd) { 
     print i, DATEd[i] 
    } 
    print "Number of items", array_length(DATEd) 

    # copy indices 
    j = 1 
    for (i in DATEd) { 
     ind[j] = i # index value becomes element value 
     j++ 
    } 
    n = asort(ind) # index values are now sorted 
    for (i = 1; i <= n; i++) 
     print i, DATEd[ind[i]] 
} 

を与える:

4 2011-01-22 
5 2011-01-22 
6 2011-01-22 
1 2011-01-22 
2 2011-01-22 
3 2011-01-22 
Number of items 6 
1 2011-01-22 
2 2011-01-22 
3 2011-01-22 
4 2011-01-22 
5 2011-01-22 
6 2011-01-22 

は、(上記のリンクを参照し、この構築物を使用し、アレイのすべての要素を介してアレイ

の説明についてgnu awk manualすぎるループを見ます)

for (var in array) 
    body 
+0

@Fredrik 5、それが何かを含んでいたかどうかを知りたいだけでした。しかし、私は今それを修正しましたが、まだ動作しません、これは今の/ [a-zA-Z0-9] /、それは動作する必要がありますか? – erik

+0

@erik @geekosaurからの回答を参照してください。3番目のフィールド、つまり「P16A22_110114072915」を使用して配列のインデックスを作成していますか? –

+0

$ 1の長さをチェックするのと同じように、おそらく最後の '、'を削除する方法があります。同じ場合には特別な場合がありますprintf "[%d、%s] \ n" 、NR-1、$ 1? =) – erik

0

-Fオプションがない場合、$3P16A22_110114072915になります(セレクタの正規表現が正しい場合もあります)。あなたは実際にどんな価値がありますか?おそらくNRが必要ですか?

awkはオブジェクト指向ではありません。その配列サポートは、親切であるために欠けています。自分で配列の長さを追跡する必要があります。 (awkの配列のサポートがどれほど制限されているかを知るために、配列を割り当てることはできません。個々のインデックスを割り当てるか、split()を使用する必要があります)。

+0

そうです。今度はもう1つの質問ですが、この配列の長さをどのように追跡するかは今のところです DATEd [NR-1] = $ 1 =) – erik

+0

'END'ブロックの'または単にカウンタを保持してください: 'DATEd [NR-1] = $ 1; len ++ 'を呼び出し、ENDブロックに' len'を使います。あるいは 'for i in DATEd'ブロックを使用することもできますが、結果は"ランダムに "並べ替えられます。 (Awkは実際には配列を持っていません、それはハッシュ値でハッシュ/ディクテーションを 'for' ...' '順序で持っています) – geekosaur

+0

助けてくれてありがとう=) – erik

関連する問題