我有一个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脚本,因为我想将这些数据上传到数据库表中。
答案 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