【问题标题】:transform csv into different format将csv转换成不同的格式
【发布时间】:2015-06-28 22:30:47
【问题描述】:

使用 BASH,我需要将我从数据源接收到的 csv 输出转换为不同的格式,以便更容易导入 SQL 服务器。

源格式是单行,有一个数据点,然后是逗号,然后是任意数量的主机,用冒号分隔。

目标格式是一个数据点,然后是逗号,然后是一行中的一个主机。然后下一行将是相同的数据点,然后是逗号,然后是下一个主机。

基本上我需要从每个数据点 1 行和多个冒号分隔的主机更改为每个数据点多行,每行只有一个主机

源码格式:

data1,host1:host2
data2,host4:host5:host6
data3,host4:host7:host1:host5:host9

我需要

data1,host1
data1,host2
data2,host4
date2,host5
data2,host6
data3,host4
data3,host7
data3,host1
data3,host5
data3,host9

【问题讨论】:

  • 感谢您重新格式化我的问题 fedorqui。
  • 没问题 :) 您可以使用“编辑”按钮和编辑器提供的工具自行编辑。
  • @CES 您可以接受解决您问题的答案。 See here了解详情。

标签: arrays bash csv


【解决方案1】:

既然格式是这样的

field1,subfield1:subfield2:...

必须成为

field1,subfield1
field1,subfield2
field1,...

我会用...

awk 'BEGIN {FS=OFS=","}
     {n=split($2,a,":")
      for (i=1; i<=n; i++) print $1, a[i]}' file

这会将字段分隔符设置为逗号。然后,它会爆炸冒号上的第二个字段。既然split返回的是片数,那么这就是循环提取值的问题。

测试

$ awk 'BEGIN {FS=OFS=","} {n=split($2,a,":"); for (i=1; i<=n; i++) print $1, a[i]}' a
data1,host1
data1,host2
data2,host4
data2,host5
data2,host6
data3,host4
data3,host7
data3,host1
data3,host5
data3,host9

【讨论】:

  • 看来我把自己的问题搞砸了。使用更具体的数据集。有 3 列数据,而不仅仅是 2。 hardware1,data1,host1:host2:host3 hardware1,data2,host3:host4:host7 hardware1,data3,host9:host3:host1 hardware2,data4,host1:host3:host5 hardware2,data5 ,host8:host2:host1
  • 它解决了你的问题吗,@CES?由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何问题,请参阅Help Center > Asking
【解决方案2】:

这里有 3 种方法:

awk -F'[,:]' '{for (i=2; i<=NF; i++) print $1","$i}' source.file

perl -F'[,:]' -lane '$d=shift @F; print "$d,$_" for @F' source.file

while IFS=",:" read -ra fields; do
     for ((i=1; i<"${#fields[@]}"; i++)); do
         echo "${fields[0]},${fields[i]}"
     done
done < source.file

【讨论】:

  • 谢谢。不知道你是否看到了,但我把自己的问题搞砸了。我实际上有 3 列,而不是 2。请参阅上面我解释它们的答案中的评论
  • @CES 你必须自己做,哪怕是最低限度。 awk ... i=3; i&lt;=NF; i++) print $2 ...
  • @CES,如果您想更改您的要求,请编辑问题。不要将线索分散在 cmets 中。我想 fedorqui 和我已经给了你足够的支持。如果您对我给您的代码有任何具体问题,请回来发表评论。
  • 是的,抱歉,这里是新的。你们俩都提供了很好的信息。我试图提高分数,但它不会让我。提供的内容解决了我的问题。我非常感激。
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2022-11-18
  • 2020-11-15
  • 2023-04-06
  • 2015-03-26
  • 2013-11-07
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多