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

时间:2017-07-11 16:44:02

标签: 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
4, Adam Left
4, Bob Jones

3 个答案:

答案 0 :(得分: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

答案 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 :(得分:0)

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

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