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