使用 BASH,我需要将从数据源收到的 csv 输出转换为不同的格式,以便更轻松地导入到 SQL Server 中。
源格式是一行,其中有一个数据点,然后是逗号,然后是由冒号分隔的任意数量的主机。
目标格式是一个数据点,然后是逗号,然后是一行上的主机之一。然后下一行将是相同的数据点,然后是逗号,然后是下一个主机。
基本上,我需要从每个数据点 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
最佳答案
由于格式类似于
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
关于arrays - 将csv转换为不同的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777694/