2013-09-27 69 views
0

我正在处理稀疏矩阵格式的极大数据集。使用awk将稀疏矩阵转换为ARFF

数据具有归档格式(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代码来将我的输入转换为我想要的输出的建议?

回答

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\[email protected]" 
    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 

现在,告诉我们有什么错那我们可以从那里去。

+0

该输出的唯一问题是,它将属性“place”视为两个单独的属性,而不是n行可以具有的一个属性,如我原始问题中所需输出示例中所示。 – owwoow14

+0

好的,我已经更新了我的答案,现在看看。 –