利用awk将稀疏矩阵转换为ARFF
我正在使用稀疏矩阵格式的超大数据集 数据具有归档格式(3个制表符分隔列,其中第一列中的字符串对应一行,第二列中的字符串对应属性,第三列中的值为加权分数) 我想使用awk(如果可能的话)将其转换为arff格式,以便使用上述内容作为输入,我可以获得以下输出:利用awk将稀疏矩阵转换为ARFF,awk,converter,arff,Awk,Converter,Arff,我正在使用稀疏矩阵格式的超大数据集 数据具有归档格式(3个制表符分隔列,其中第一列中的字符串对应一行,第二列中的字符串对应属性,第三列中的值为加权分数) 我想使用awk(如果可能的话)将其转换为arff格式,以便使用上述内容作为输入,我可以获得以下输出: @relation 'filename' @attribute "place" string @attribute "institution" string @attribute "food" string @attribute "book"
@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代码来将输入转换成所需的输出 我不知道什么是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
$cat tst.awk
开始{FS=“\t”}
NR==1{printf“@关系“%s”\n”,文件名}
{
行=$1
属性=2美元
如果(!seenRow[row]++){
行[++numRows]=行
}
如果(!seenAttr[attr]++){
printf“@attribute\%s\”字符串\n”,属性
属性[++numAttrs]=attr
}
分数[行,属性]=3美元
}
结束{
打印“\n\n@data"
对于(rowNr=1;rowNr),该输出的唯一问题是,它将属性“place”视为两个单独的属性,而不是n行可以具有的一个属性,如我的原始问题中所示的所需输出示例中所示。
$ 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