将csv转换为不同的格式

时间:2015-04-21 16:11:34

标签: arrays bash csv

使用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

2 个答案:

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

答案 1 :(得分:1)

以下是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