在awk中的每个记录之前和之后打印

时间:2019-06-09 02:23:22

标签: json awk ldif

我正在尝试使用awk将LDIF转换为JSON。

无法弄清楚每条多行记录前后的打印方式。可以每行一次或在每行前后以BEGIN和END打印一次。但是永远不会在每条记录之前和之后。

awk的实际LDIF输入为:

dn: CN=foo
objectClass: top

dn: CN=bar
objectClass: top

要转换为awk,需要输出如下所示:

{
  "dn": "CN=foo",
  "objectClass": "top"
}
{
  "dn": "CN=bar",
  "objectClass": "top"
}

脚本1用大括号将记录的每一行换行。

BEGIN {                                                                                                                                                        
        RS="\n\n#";
        FS=": ";
}
print "{"
{
        print "\""$1"\": \""$2"\",";
}
print "}"

脚本2使用大括号括起来包装所有记录集:

BEGIN {                                                                                                                                                        
        RS="\n\n#";
        FS=": ";
        print "{"
}
{
        print "\""$1"\": \""$2"\",";
}
END{
        print "}"
}

似乎awk仅具有BEGIN,END和隐式循环记录(单行或多行)。我不知道如何在每条多行记录之前和之后打印内容。这可能在awk中吗?是否有更好的方法将LDIF转换为JSON?

一个awk脚本(而不是一个衬里)会是什么,从LDIF到JSON的转换看起来会如此?

1 个答案:

答案 0 :(得分:0)

idk您以为awk脚本会做些什么,但要从发布的输入中获得发布的预期输出,您需要做的是:

$ awk '!/^[{}]/{print ( (NR-1)%2 ? "{" ORS $0 : $0 ORS "}" )}' file
{
record1 line1
record1 line2
}
{
record2 line1
record2 line2
}

更新:给定的记录之前/之后,您输入的打印更新更简单:

$ awk -v RS= '{print "{" ORS $0 ORS "}"}' file
{
dn: CN=foo
objectClass: top
}
{
dn: CN=bar
objectClass: top
}

要获得您在问题中显示的输出,将是:

$ cat tst.awk
BEGIN { RS=""; FS="\n" }
{
    print "{"
    for (i=1; i<=NF; i++) {
        tag = val = $i
        sub(/:.*/,"",tag)
        sub(/[^:]+:[[:space:]]*/,"",val)
        printf "  \"%s\": \"%s\"%s\n", tag, val, (i<NF ? "," : "")
    }
    print "}"
}

$ awk -f tst.awk file
{
  "dn": "CN=foo",
  "objectClass": "top"
}
{
  "dn": "CN=bar",
  "objectClass": "top"
}