使用shell脚本创建“智能”csv文件

时间:2015-12-03 16:30:51

标签: bash csv

我有一个txt文件,其中包含以下格式的一些记录:

Name=Kevin
Age=33
Gender=M
Street=LA Road
Occupation=Service
Name=Josh
Age=22
Gender=M
Occupation=None
Name=Sarah
Street=First Avenue
Occupation=Administrator
...

正如您所看到的,我有一组不同的属性可以一个接一个地识别某些人,但并非所有人都可以设置所有属性。 总是要设置的唯一属性是Name值,因此我可能会将其用作分隔符(因为不同Name值之间的每个值肯定都会被引用到{{1}的第一个值值}。

我想从上面的文件生成一个csv文件,如下所示

文件:Name - >

output.csv

请你帮我写一个shell / perl脚本,因为我想将这些数据上传到数据库表中。

2 个答案:

答案 0 :(得分:1)

这看起来很简单awk; perl可能有点矫枉过正:

awk -F= 'BEGIN {OFS=";"; print "Name;Age;Gender;Street;Occupation"}
         $1=="Name"{if(name)print name,a,g,s,o;
           name=$2; a=g=s=o="<**BLANK**>"}
         $1=="Age"        {a=$2}
         $1=="Gender"     {g=$2}
         $1=="Street"     {s=$2}
         $1=="Occupation" {o=$2}
         END {if(name)print name,a,g,s,o}'

答案 1 :(得分:0)

以下内容创建了一个表格,当我们收到新的键/值对时,它会向右增长,并在我们看到&#34;名称&#34;关键字。优点是除了&#34; Name,&#34;脚本中没有关键字的硬编码期望 - 它只是在看到新事物时调整和增长表。

#! /usr/bin/awk -f
BEGIN {
        FS  = "="
        OFS = ";"
        key = 1
        val = 2
        split("", head)
        split("", table)
        row = 0
        col = 0
        name = 0
        blank = "<**BLANK**>"
}
NF == 2 {
        if (!name && $key != "Name")
                table[0,head["Name"]=col++] = "Name"
        name = 1
        if (!($key in head)) {
                for (i=1; i<=row; i++)
                        table[i, col] = blank
                table[0,head[$key]=col++] = $key
        }
        if ($key == "Name") {
                row++
                for(i=0; i<col; i++)
                         table[row,i] = blank
        table[row,head[$key]] = $val
}
END {
        for (i=0; i<=row; i++) {
                if (!col)
                        break
                x = table[i,0]
                for (j=1; j<col; j++)
                        x = x OFS table[i,j]
                print x
        }
}

输出如下:

Name;Age;Gender;Street;Occupation
Kevin;33;M;LA Road;Service
Josh;22;M;<**BLANK**>;None
Sarah;<**BLANK**>;<**BLANK**>;First Avenue;Administrator