【问题标题】:use awk to transform an 'n column' csv dataset to an '(n-1) column' dataset使用 awk 将“n 列”csv 数据集转换为“(n-1) 列”数据集
【发布时间】:2017-12-15 20:31:32
【问题描述】:

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

带有第一行标题和所需输出的示例 csv 输入。

输入.csv

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

输出.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

【问题讨论】:

  • ID 3 来自哪里?
  • 我将重量更改为 3 限制对“重量”列的混淆。 “亚当到鲍勃”的连接发生了 3 次
  • 根据您的原始数据,您的第二个表仍然没有意义......
  • Adam Left 和 Bob Jones 有 3 个连接,因此需要在输出中列出 3 次。

标签: csv awk sed dataset


【解决方案1】:

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

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

【讨论】:

  • 你看到我把权重改成3了吗?
  • 我收到一个错误。 awk:第 1 行附近的语法错误 awk:第 1 行附近的非法语句
  • 无论您的数据文件是什么,您都必须在包含ad.data 的目录中运行它。
【解决方案2】:

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

【讨论】:

  • 我刚刚注意到 ID 1 重复了四行。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多