2017-07-11 36 views
-2

我有一个将图数据集更改为事务数据集的数据转换问题。我应该使用AWK还是使用不同的语言?使用awk将'n列'csv数据集转换为'(n-1)列'数据集

使用第一行标题和期望的输出示例csv输入。

input.csv

TO, FROM, WEIGHT 
Bob Jones, Tom P. Fisher, 1 
Adam Left, Bob Jones, 3 

output.csv

ID, TARGET 
1, Bob Jones 
1, Tom P. Fisher 
2, Adam Left 
2, Bob Jones 
3, Adam Left 
3, Bob Jones 
4, Adam Left 
4, Bob Jones 
+1

哪里呢'ID 3'来自? – RomanPerekhrest

+0

我将权重更改为3关于“权重”列的限制混淆。 'Adam to Bob'连接发生3次 – adm

+1

根据您的原始数据,您的第二张表格没有任何意义.... –

回答

1

另在AWK:

$ awk ' 
BEGIN { 
    FS=OFS=", "     # set delimiters 
    print "ID", "TARGET"  # output header 
} 
$NF~/[0-9]+/ {     # process records which end in a value 
    for(i=1;i<=$NF;i++) {  # loop $NF many times 
     c++      # counter 
     for(j=1;j<NF;j++)  # for each name 
      print c, $j   # print count and name 
    } 
}' file 
ID, TARGET 
1, Bob Jones 
1, Tom P. Fisher 
2, Adam Left 
2, Bob Jones 
3, Adam Left 
3, Bob Jones 
4, Adam Left 
4, Bob Jones 
+2

修正了错字... – karakfa

0

哪里ad.data为您的数据文件和ad.csv是你的输出文件。

awk 'BEGIN {FS=OFS=","} {print $3, $1\n$2, $1}' ad.data>ad.csv 
+0

您是否看到我将体重改为3? – adm

+0

我收到一个错误。 awk:第1行附近的语法错误 awk:第1行附近的非法语句 – adm

+0

无论您的数据文件是什么,您都必须在包含'ad.data'的目录中运行此语句。 –

1

AWK溶液:

awk -F',[[:space:]]*' 'BEGIN{ print "ID, TARGET" }NR>1{ id_cnt+=$3; id=(NR==2)? 1 : id_cnt-$3; 
    for(i=id;i<=id_cnt;i++) printf("%d, %s\n%d, %s\n",i,$1,i,$2) }' file 

输出:

ID, TARGET 
1, Bob Jones 
1, Tom P. Fisher 
1, Adam Left 
1, Bob Jones 
2, Adam Left 
2, Bob Jones 
3, Adam Left 
3, Bob Jones 
4, Adam Left 
4, Bob Jones 
+0

我刚刚注意到ID 1在四行中重复。 – adm