1

次のテストスクリプトがあります

 /^[^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 は機能しません。

ありがとう

編集_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

@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"]
]

IE はソートされ、最後の終了文字「]」の前の最後の「,」文字が削除されます。これは簡単に達成できますか?=)

ありがとう =)

編集3最終結果_ _ _ _ _ _ _ _ _ _ __ _ _ __ _ _ _ _ __ _ ____

@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 "        ]"
}
4

2 に答える 2

0

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

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

于 2011-06-29T16:11:48.870 に答える
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 のマニュアルを参照してください。

配列のすべての要素をループしすぎる場合は、この構造を使用してください (上記のリンクを参照)

 for (var in array)
   body
于 2011-06-29T16:11:01.920 に答える