2013-09-27 70 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

好的,我已經更新了我的答案,現在看看。 –