我正在使用稀疏矩阵格式的极大数据集。
数据具有归档格式(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代码将我的输入转换为我想要的输出?
答案 0 :(得分: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
现在,告诉我们这有什么问题,我们可以从那里开始。