代码之家  ›  专栏  ›  技术社区  ›  owwoow14

使用awk将稀疏矩阵转换为ARFF

  •  0
  • owwoow14  · 技术社区  · 11 年前

    我正在处理一个稀疏矩阵格式的超大数据集。

    数据具有归档格式(3个制表符分隔列,其中第一列中的字符串对应于一行,第二列中的串对应于属性,第三列中的值是加权分数)。

    church place 3
    church institution 6
    man place 86
    man food 63
    woman book 37
    

    我想使用awk(如果可能的话)将其转换为arff格式,以便使用以上内容作为输入,我可以获得以下输出:

    @relation 'filename'
    @attribute "place" string
    @attribute "institution" string
    @attribute "food" string
    @attribute "book" string
    
    
    @data
    3,6,0,0,church
    86,0,63,0,man
    0,0,0,37,woman
    

    我看过这个awk文件 HERE ,这产生了一个与我所需要的非常相似的结果。 然而,输入有点不同。我试图通过将FS=“|”更改为“\t”来操作所提供的代码,但它没有产生所需的结果。 有人建议我如何操作这个awk代码,将我的输入转换为我想要的输出吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ed Morton    11 年前

    我不知道arff是什么(也不需要知道如何帮助您将文本转换为不同的格式),所以让我们从以下内容开始:

    $ cat tst.awk
    BEGIN{ FS="\t" }
    NR==1 { printf "@relation '%s'\n", FILENAME }
    {
        row = $1
        attr = $2
    
        if (!seenRow[row]++) {
            rows[++numRows] = row
        }
    
        if (!seenAttr[attr]++) {
            printf "@attribute \"%s\" string\n", attr
            attrs[++numAttrs] = attr
        }
    
        score[row,attr] = $3
    }
    END {
        print "\n\n@data"
        for (rowNr=1; rowNr<=numRows; rowNr++) {
            row = rows[rowNr]
            for (attrNr=1;attrNr<=numAttrs;attrNr++)  {
                attr = attrs[attrNr]
                printf "%d,", score[row,attr]
            }
            print row
        }
    }
    $
    $ cat file
    church  place   3
    church  institution     6
    man     place   86
    man     food    63
    woman   book    37
    $
    $ awk -f tst.awk file
    @relation 'file'
    @attribute "place" string
    @attribute "institution" string
    @attribute "food" string
    @attribute "book" string
    
    
    @data
    3,6,0,0,church
    86,0,63,0,man
    0,0,0,37,woman
    

    现在,告诉我们这有什么问题,我们可以从那里开始。