Bash 将键值对转换为CSV的Shell脚本

Bash 将键值对转换为CSV的Shell脚本,bash,shell,csv,export-to-csv,keyvaluepair,Bash,Shell,Csv,Export To Csv,Keyvaluepair,我得到了一个由多个键值对组成的文件,一组键值对的每个条目用一个空行分隔。该文件如下所示: Name = Jhon Age = 27 Street = LA Road Occupation = Service Gender = M Name = Anindya Gender = M Street = GNB Road Occupation = Consultant Age = 26 Phone = 0987654321 Age = 55 Gender = F Street = Jodhpur

我得到了一个由多个键值对组成的文件,一组键值对的每个条目用一个空行分隔。该文件如下所示:

Name = Jhon
Age = 27
Street = LA Road
Occupation = Service
Gender = M

Name = Anindya
Gender = M
Street = GNB Road
Occupation = Consultant
Age = 26
Phone = 0987654321

Age = 55
Gender = F
Street = Jodhpur Road
Name = Gopa

Gender = M
Name = Ashok
Occupation = Service
Phone = 1234567890
我希望在处理文件后从代码中获得以下输出:

Name,Age,Gender,Street,Occupation,Phone
Jhon,27,M,LA Road,Service,
Anindya,26,M,GNB Road,Consultant,0987654321
Gopa,55,F,Jodhpur Park,,
Ashok,,M,,Service,1234567890
我尝试过使用awk,但是按键的排列不一致,因此我没有得到想要的输出


我需要一个Bash脚本,它可以为我提供上述输出。

将值存储在关联数组中(需要Bash版本4)

#/bin/bash
set-eu
列=(姓名年龄性别街道职业电话)
declare-记录头
对于“${columns[@]}”中的c;做
记录[$c]=$c
标题[$c]=1
完成
输出(){
对于((i=0;i&2
出口1
elif[[!${header[$key]:-}]];然后
回显无效的键“'$key'>”&2
出口1
其他的
记录[$key]=$value
fi
完成
#别忘了最后一行!
输出

将值存储在关联数组中(需要bash版本4)

!/bin/bash
set-eu
列=(姓名年龄性别街道职业电话)
declare-记录头
对于“${columns[@]}”中的c,请执行以下操作
记录[$c]=$c
标题[$c]=1
完成
输出(){
对于((i=0;i&2
出口1
elif[[!${header[$key]:-}]];然后
回显无效的键“'$key'>”&2
出口1
其他的
记录[$key]=$value
fi
完成
#别忘了最后一行!
输出
对于awk来说不是问题:

awk -F " = " -v OFS="," '
    BEGIN { print "Name", "Age", "Gender", "Street", "Occupation", "Phone" }
    function printline() {
        print data["Name"], data["Age"], data["Gender"], data["Street"], data["Occupation"], data["Phone"]
    }
    {data[$1] = $2}
    NF == 0 {printline(); delete data}
    END {printline()}
'
输出

姓名、年龄、性别、街道、职业、电话
约翰,27岁,M,洛杉矶,服务,
Anindya,26岁,男性,国民银行顾问,0987654321
焦特布尔路55楼戈帕,,
Ashok,M,服务部,1234567890
对于awk来说不是问题:

awk -F " = " -v OFS="," '
    BEGIN { print "Name", "Age", "Gender", "Street", "Occupation", "Phone" }
    function printline() {
        print data["Name"], data["Age"], data["Gender"], data["Street"], data["Occupation"], data["Phone"]
    }
    {data[$1] = $2}
    NF == 0 {printline(); delete data}
    END {printline()}
'
输出

姓名、年龄、性别、街道、职业、电话
约翰,27岁,M,洛杉矶,服务,
Anindya,26岁,男性,国民银行顾问,0987654321
焦特布尔路55楼戈帕,,
Ashok,M,服务部,1234567890

试试看:@avihoomaka.Hmmm….不。在这种情况下,你在这里发布的链接的公认解决方案不起作用,因为每个组中的行顺序都不固定。@avihoomaka这是为了数据一致。首先,试着自己编写脚本,然后在这里发布关于脚本的问题。试试看:@avihoomaka.Hmmm…不。在这种情况下,您在此处发布的链接的公认解决方案不起作用,因为每个组中的行顺序不是固定的。@AvihooMamka这是用于一致数据的。首先,请尝试自己编写脚本,然后在此处发布有关脚本的问题。注意关联数组仅在bash 4+中可用,谢谢@Choroba!!!脚本正在工作,但空格已从值中删除。@安迪:抱歉,
printf
中缺少双引号。现在应该修复。注意关联数组仅在bash 4+中可用,谢谢@Choroba!!!脚本正在工作,但空格已从值中删除。@安迪:抱歉,
printf 。现在应该修复。谢谢@Glenn,但带空格的值似乎被截断了。答案更新(请参阅更改的内容)谢谢@Glenn,但带空格的值似乎被截断了。答案更新(请参阅更改的内容)