我试图从EVA二进制数据库中获取数据,其中字段由一些特殊符号分隔。到目前为止,我已设法将日期转换为以下格式的类似XML的文本文件。注意字段的顺序是如何变化的,并不是所有字段都是强制性的。
<251>id1<230><223>author1<228><215>title1<223><230>year1<225><232>location1<226>
<251>id2<230><223>author2<228><230>year2<225><232>location2<226><215>title2<223>
<251>id3<230><230>year2<225><232>location2<226><215>title2<223>
每一行都是单独的条目,对于每一行我都希望得到类似
的内容251=id1
223=author1
等
现在我正在努力解析它的数据。我通常使用explode函数并定义分隔符,但我不能在这里这样做,因为那时我会丢失某个子字符串属于哪个字段的信息。
也许我应该提到最终我想要生成一个CSV文件,所以也许有一种方法可以直接从我的文本文件中解析它,跳过分别解析每个数据的冗余过程然后再以另一种格式合并它
答案 0 :(得分:2)
喜欢这个吗?
$ cat tst.awk
BEGIN {
FS="[<>]+"
OFS="="
}
{
for (i=2;i<NF;i+=3) {
print $i, $(i+1)
}
print ""
}
$ awk -f tst.awk file
251=id1
223=author1
215=title1
230=year1
232=location1
251=id2
223=author2
230=year2
232=location2
215=title2
251=id3
230=year2
232=location2
215=title2
重新阅读你的问题之后,这可能更接近你真正想要的了:
$ cat tst.awk
BEGIN { FS="[<>]+"; OFS="," }
{
for (i=2;i<NF;i+=3) {
if (!seenName[$i]++) {
names[++numNames] = $i
}
n2v[NR,$i] = $(i+1)
}
}
END {
for (nameNr=1; nameNr<=numNames; nameNr++) {
printf "%s%s", names[nameNr], (nameNr<numNames?OFS:ORS)
}
for (recNr=1; recNr<=NR; recNr++) {
for (nameNr=1; nameNr<=numNames; nameNr++) {
name = names[nameNr]
printf "%s%s", n2v[recNr,name], (nameNr<numNames?OFS:ORS)
}
}
}
$
$ awk -f tst.awk file
251,223,215,230,232
id1,author1,title1,year1,location1
id2,author2,title2,year2,location2
id3,,title2,year2,location2
如果没有,那么根据您发布的输入更新您的问题以显示您想要的实际输出。