0

我正在使用稀疏矩阵格式的超大数据集。

数据具有归档格式(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 文件,它产生的结果与我需要的非常相似。但是,输入有点不同。我试图通过更改 FS = "|" 来操纵提供的代码 到“\t”,但它不会产生预期的结果。有没有人建议我如何操纵这个 awk 代码将我的输入转换为我想要的输出?

4

1 回答 1

2

我不知道 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

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

于 2013-09-27T09:33:18.763 回答