0

トピックが示唆するように、複数のテキスト ファイルから情報を読み込み、異なるテキスト ファイルで複数回発生するかどうかに関係なく、要素を配列に 1 回だけ追加する方法を教えてください。

さまざまなドキュメントで発生する順序ですべての要素を読み込んで出力するこのスクリプトから始めました。

たとえば、次のデータを含む 3 つの異なるテキスト ファイルを見てください。

ファイル 1:

2011-01-22 22:12 test1 22 1312 75 13.55 1399 
2011-01-23 22:13 test4 22 1112 72 12.55 1499

ファイル 2:

2011-01-24 22:14 test1 21 1322 75 23.55 1599 
2011-01-25 22:15 test2 23 2312 77 33.55 1699 

ファイル 3:

2011-01-26 22:16 test2 20 1412 79 63.55 1799 
2011-01-27 22:17 test5 12 1352 78 43.55 1999 

現在の要素が既に配列に追加されているかどうかを確認したいのですが、今のところ、スクリプトはすべての要素を出力します。

{
    BUILDd[NR-1] = $3; len++
}
   END { 
        SUBSYSTEM=substr(FILENAME, 1, length(FILENAME)-7)
        LABEL= "\"" toupper(SUBSYSTEM) "\""
        print  "#{"
        print "\"buildnames\": {"
        print "        \"label\": \"buildnames\","
        print "        \"data\": ["
        for (i = 0 ; i <= len-1; i ++ ) {
        if(i == len-1){print "            [\"" BUILDd[i] "\"]"}
        else
            { print "            [\"" BUILDd[i] "\"],"}
        }
        print "        ]"
        print " }"
        print "};"
}

この出力を与える

#{
"buildnames": {
        "label": "buildnames",
        "data": [
            ["test1"]
            ["test4"]
            ["test1"]
            ["test2"]
            ["test2"]
            ["test5"]
        ]
        }
};

次を出してほしいとき

#{
"buildnames": {
        "label": "buildnames",
        "data": [
            ["test1"]
            ["test2"]
            ["test4"]
            ["test5"]
        ]
        }
};

1)つまり、最初に要素がすでに配列にあるかどうかを確認し、そうでない場合はそれを追加します

2)可能であれば、後で配列をソートします

ありがとう =)

4

1 に答える 1

1

フォーマットを除いて、これはあなたが達成しようとしているものですか(a、b、cはログを含むファイルです)?

$ cut -d" " -f3 a b c | sort | uniq
test1
test2
test4
test5

awk の使用

{
    BUILDd[$3] = 1
}
END {
    for (i in BUILDd) {
    print i
    }
}

与える

awk -f a.awk a b c
test1
test2
test4
test5

ここでの正しい並べ替え順序は純粋に偶然であることに注意してください...配列に入れられる順序は、印刷される順序ではありません。

于 2011-06-30T09:06:42.683 に答える