使用awk转换';n列';csv数据集到';(n-1)列';数据集

使用awk转换';n列';csv数据集到';(n-1)列';数据集,csv,awk,sed,dataset,Csv,Awk,Sed,Dataset,我有一个将图形数据集更改为事务数据集的数据转换问题。我应该使用AWK还是使用其他语言 带有第一行标题和所需输出的示例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

我有一个将图形数据集更改为事务数据集的数据转换问题。我应该使用AWK还是使用其他语言

带有第一行标题和所需输出的示例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

其中,
ad.data
是您的数据文件,
ad.csv
是您的输出文件

awk 'BEGIN {FS=OFS=","} {print $3, $1\n$2, $1}' ad.data>ad.csv
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
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
$awk'
开始{
FS=OFS=“,”#设置分隔符
打印“ID”、“目标”#输出标题
} 
$NF~/[0-9]+/{#以值结尾的进程记录

对于(i=1;i
ID 3
来自何处?我将权重更改为3,限制了对“权重”列的混淆。“Adam-to-Bob”连接发生了3次根据原始数据,您的第二个表仍然没有意义…Adam Left和Bob Jones有3个连接,因此需要在输出中列出3次。您看到我更改了吗d权重为3?我得到一个错误。awk:第1行附近的语法错误awk:第1行附近的非法语句您必须在包含
ad.data
的目录中运行此命令,无论您的数据文件是什么。我刚刚注意到ID 1在四行中重复。
$ 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