-1

プログラミングではないので、ここで質問してよいかどうかはわかりませんが、他にどこに行けばよいかわかりません。次のデータを一貫した方法で整理したいと考えています。現時点では、最初の 2 列 (コンマ区切り) のみが一貫しており、混乱しています。残りの列には 1 ~ 9 の番号が付けられ、通常は異なります。言い換えれば、テキストが一致するように並べ替えたい (行のすべての値列、行のすべての反動列など)。次に、テキストを削除してヘッダーを追加できますが、それでも意味があります。

bm_wp_upg_o_t1micro, sight, value = 3, zoom = 3, recoil = 1, spread_moving = -1 
bm_wp_upg_o_marksmansight_rear, sight, value = 3, zoom = 1, recoil = 1, spread = 1 
bm_wp_upg_o_marksmansight_front, extra, value = 1 
bm_wp_m4_upper_reciever_edge, upper_reciever, value = 3, recoil = 1 
bm_wp_m4_upper_reciever_round, upper_reciever, value = 1 
bm_wp_m4_uupg_b_long, barrel, value = 4, damage = 1, spread = 1, spread_moving = -2, concealment = -2 

どんな提案も(実際にこれを尋ねるのに適切な場所であっても)素晴らしいでしょう. コンテキストは、私が整理しようとしているゲーム ファイルから取り出された単なる生データです。

4

3 に答える 3

1

別の awk バージョンを作成しました。これで少しは読みやすくなったと思います。可能な限り動的にするために、すべての値/列がファイルから読み取られます。

awk -F, '
    {
    ID[$1]=$2                   # use column 1 as index
    for (i=3;i<=NF;i++ )        # loop through all fields from #3 to end
        {
        gsub(/ +/,"",$i)            # remove space from field
        split($i,a,"=")         # split field in name and value a[1] and a[2]
        COLUMN[a[1]]++          # store field name as column name
        DATA[$1" "a[1]]=a[2]    # store data value in DATA using field #1 and column name as index
        }
    } 
END {
    printf "%49s   ","info"     # print info
    for (i in COLUMN)
        {printf "%15s",i}       # print column name
    print ""
    for (i in ID)               # loop through all ID
        {
        printf "%32s %16s ",i, ID[i]    # print ID and info
        for (j in COLUMN)
            {
            printf "%14s ",DATA[i" "j]+0    # print value
            }
        print ""
        }
    }' file

出力

                                             info            spread         recoil           zoom    concealment  spread_moving         damage          value
   bm_wp_m4_upper_reciever_round   upper_reciever              0              0              0              0              0              0              1
            bm_wp_m4_uupg_b_long           barrel              1              0              0             -2             -2              1              4
  bm_wp_upg_o_marksmansight_rear            sight              1              1              1              0              0              0              3
 bm_wp_upg_o_marksmansight_front            extra              0              0              0              0              0              0              1
    bm_wp_m4_upper_reciever_edge   upper_reciever              0              1              0              0              0              0              3
             bm_wp_upg_o_t1micro            sight              0              1              3              0             -1              0              3
于 2013-08-23T07:55:31.497 に答える
0

イーサンの答えに固執します—これは私が楽しんでいるだけです. (そして、はい、それは私をかなり奇妙にします!)

awk スクリプト

awk 'BEGIN  {
                # f_idx[field] holds the column number c for a field=value item
                # f_name[c]    holds the names
                # f_width[c]   holds the width of the widest value (or the field name)
                # f_fmt[c]     holds the appropriate format
                FS = " *, *"; n = 2;
                f_name[0] = "id";   f_width[0] = length(f_name[0])
                f_name[1] = "type"; f_width[1] = length(f_name[1])
            }
            {
                #-#print NR ":" $0
                line[NR,0] = $1
                len = length($1)
                if (len > f_width[0])
                    f_width[0] = len
                line[NR,1] = $2
                len = length($2)
                if (len > f_width[1])
                    f_width[1] = len
                for (i = 3; i <= NF; i++)
                {
                    split($i, fv, " = ")
                    #-#print "1:" fv[1] ", 2:" fv[2]
                    if (!(fv[1] in f_idx))
                    {
                        f_idx[fv[1]] = n
                        f_width[n++] = length(fv[1])
                    }
                    c = f_idx[fv[1]]
                    f_name[c] = fv[1]
                    gsub(/ /, "", fv[2])
                    len = length(fv[2])
                    if (len > f_width[c])
                        f_width[c] = len
                    line[NR,c] = fv[2]
                    #-#print c ":" f_name[c] ":" f_width[c] ":" line[NR,c]
                }
            }
     END    {
                for (i = 0; i < n; i++)
                    f_fmt[i] = "%s%" f_width[i] "s"
                #-#for (i = 0; i < n; i++)
                #-#    printf "%d: (%d) %s %s\n", i, f_width[i], f_name[i], f_fmt[i]
                #-#    pad = ""
                for (j = 0; j < n; j++)
                {
                    printf f_fmt[j], pad, f_name[j]
                    pad = ","
                }
                printf "\n"
                for (i = 1; i <= NR; i++)
                {
                    pad = ""
                    for (j = 0; j < n; j++)
                    {
                        printf f_fmt[j], pad, line[i,j]
                        pad = ","
                    }
                    printf "\n"
                }
            }' data

このスクリプトは、ファイル内で検出したデータに適応します。列見出し「id」を入力の列 1 に割り当て、「type」を列 2 に割り当てます。列 3..N の値のセットごとに、データをキー (in fv[1]) と値 ()に分割します。でfv[2])。キーが以前に見られなかった場合、新しい列番号が割り当てられ、キーが列名として格納され、キーの幅が最初の列幅として格納されます。次に、値が行内の適切な列に格納されます。

すべてのデータが読み取られると、スクリプトは列見出しがどうなるかを認識します。次に、フォーマット文字列のセットを作成できます。次に、見出しとデータのすべての行を出力します。固定幅の出力が必要ない場合は、スクリプトを大幅に簡素化できます。このスクリプトにはいくつかの (大部分は軽微な) 単純化を行うことができます。

データファイル

bm_wp_upg_o_t1micro, sight, value = 3, zoom = 3, recoil = 1, spread_moving = -1 
bm_wp_upg_o_marksmansight_rear, sight, value = 3, zoom = 1, recoil = 1, spread = 1 
bm_wp_upg_o_marksmansight_front, extra, value = 1 
bm_wp_m4_upper_receiver_edge, upper_receiver, value = 3, recoil = 1 
bm_wp_m4_upper_receiver_round, upper_receiver, value = 1 
bm_wp_m4_uupg_b_long, barrel, value = 4, damage = 1, spread = 1, spread_moving = -2, concealment = -2

出力

                             id,          type,value,zoom,recoil,spread_moving,spread,damage,concealment
            bm_wp_upg_o_t1micro,         sight,    3,   3,     1,           -1,      ,      ,           
 bm_wp_upg_o_marksmansight_rear,         sight,    3,   1,     1,             ,     1,      ,           
bm_wp_upg_o_marksmansight_front,         extra,    1,    ,      ,             ,      ,      ,           
   bm_wp_m4_upper_receiver_edge,upper_receiver,    3,    ,     1,             ,      ,      ,           
  bm_wp_m4_upper_receiver_round,upper_receiver,    1,    ,      ,             ,      ,      ,           
           bm_wp_m4_uupg_b_long,        barrel,    4,    ,      ,           -2,     1,     1,         -2
于 2013-08-23T05:59:27.260 に答える