データ構造

データ構造

次の形式の出力があります。

count  id     type
588    10 |    3
 10    12 |    3
883    14 |    3
 98    17 |    3
 17    18 |    1
77598    18 |    3
10000    21 |    3
17892     2 |    3
20000    23 |    3
 63    27 |    3
  6     3 |    3
 2446    35 |    3
 14    4 |    3
 15     4 |    1
253     4 |    2
19857     4 |    3
 1000     5 |    3
...

これは非常に汚れているため、プロジェクトマネージャに送信してスプレッドシートを混乱させるようにCSVファイルにまとめる必要があります。

問題の核心は次のとおりです。必要な出力は次のとおりです。

id、sum_of_type_1、sum_of_type_2、sum_of_type_3

ID「4」は例です。

14    4 |    3
 15     4 |    1
253     4 |    2
19857     4 |    3

これはおそらく次のとおりです。

4,15,253,19871

残念ながら、私はこのようなことをやり直してすべての行を整理してCSVに変換しましたが、行の重複を削除してグループ化することはできません。今私はこれを持っています:

awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'

しかし、やるべきことは、ジャンク文字を整理してその行を再印刷することだけです。

上記の出力に行を適用する最良の方法は何ですか?

ベストアンサー1

一つの方法は、すべてをハッシュに入れることです。

# put values into a hash based on the id and tag
awk 'NR>1{n[$2","$4]+=$1}
END{
    # merge the same ids on the one line
    for(i in n){
        id=i;
        sub(/,.*/,"",id);
        a[id]=a[id]","n[i];
    }
    # print everyhing
    for(i in a){
        print i""a[i];
    }
}'

編集:私の最初の答えは質問に正しく答えませんでした。

おすすめ記事