Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
若我将字段归零,为什么awk会进行不同的OFS解析?_Awk - Fatal编程技术网

若我将字段归零,为什么awk会进行不同的OFS解析?

若我将字段归零,为什么awk会进行不同的OFS解析?,awk,Awk,通过增加可靠分隔符上的计数器来解析多行“记录”(将使用sed的/^$/) 解析如下所示的ldif(但我希望它能快速推广到其他记录类型,例如creationTime) 并希望能够产生 uid, cn, ... asd, Adam Saddler, ... mfwth, Mike Foksworth, ... 其中,…是我想让awk解析的其他字段,而不是混合在gsubs中 我正在用语法分析它 $ awk -vOFS=';' /dn/{ i++ } /cn/{ users[i]["cn"]=$

通过增加可靠分隔符上的计数器来解析多行“记录”(将使用sed的
/^$/

解析如下所示的ldif(但我希望它能快速推广到其他记录类型,例如creationTime)

并希望能够产生

uid, cn, ...
asd, Adam Saddler, ...
mfwth, Mike Foksworth, ...
其中,
是我想让
awk
解析的其他字段,而不是混合在
gsub
s中

我正在用语法分析它

$ awk
 -vOFS=';'
 /dn/{ i++ }
 /cn/{ users[i]["cn"]=$0 }
 /uid/{ users[i]["uid"]=$0 }
 END{ for (j in users) print users[j]["uid"] "_" users[j]["cn"] }'
和get(其中
\u
是“\u”、制表符或空格)

相反,在存储之前修改匹配项
/xx/{$1=”“;…}

$ awk
 -vOFS=';'
 /dn/{ i++ }
 /cn/{ $1="" ; users[i]["cn"]=$0 }
 /uid/{ $1="" ; users[i]["uid"]=$0 }
 END{ for (j in users) print users[j]["uid"] " " users[j]["cn"] }'
似乎使输出字段分隔符(OFS)再次相关

;asd; Adam;Saddler
;mfwth; Mike;Foksworth
为什么awk将第一个作为一个块(字符串?)输出,而将第二个作为一系列记录解析并输出?

分配给任何字段(例如,第二个脚本中的
$1=“”
),特别告诉awk重新编译当前记录(
$0
),用
OFS
替换每个
FS

下面是如何真正做到你想做的事情:

$ cat tst.awk
NF {
    tag = val = $0
    sub(/:.*/,"",tag)
    sub(/[^:]*:[[:space:]]*/,"",val)
    tag2val[tag] = val
    next
}
{ prt() }
END { prt() }
function prt(   tagNr,tags,numTags,tag,val) {
    OFS=", "
    numTags = split("uid cn",tags)
    if ( ++numRecs == 1 ) {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            tag = tags[tagNr]
            printf "%s%s", tag, (tagNr<numTags ? OFS : ORS)
        }
    }
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        val = tag2val[tag]
        printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
    }
    delete tag2val
}

$ awk -f tst.awk file
uid, cn
asd, Adam Saddler
mfwth, Mike Foksworth

如果我理解正确,您希望提取
=
字符后面的字段

此GNU awk脚本可能会帮助您:

awk 'BEGIN{
      RS="\n\ndn: |,|\n"
      FS="[=:] *"
    }
    NF{a=a (a?",":"")$2}
    RT~/dn:/{print a;a=""}
    END{print a}' file
设置记录分隔符
RS
,以捕获由
dn:
或换行符分隔的记录

字段分隔符设置为使用
=
拆分关键字和值


main语句用所有值填充变量
a
。当找到
dn:
关键字时,或者当它是文件的结尾时,将打印变量
a

请在代码标签中发布正确的预期输出,然后让我们知道。Ed Morton对此进行了解释,但如果您想在文档中看到它,请查找了解的信息本页末尾的ng$0部分:
$ cat tst.awk
NF {
    tag = val = $0
    sub(/:.*/,"",tag)
    sub(/[^:]*:[[:space:]]*/,"",val)
    tag2val[tag] = val
    next
}
{ prt() }
END { prt() }
function prt(   tagNr,tags,numTags,tag,val) {
    OFS=", "
    numTags = split("uid cn",tags)
    if ( ++numRecs == 1 ) {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            tag = tags[tagNr]
            printf "%s%s", tag, (tagNr<numTags ? OFS : ORS)
        }
    }
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        val = tag2val[tag]
        printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
    }
    delete tag2val
}

$ awk -f tst.awk file
uid, cn
asd, Adam Saddler
mfwth, Mike Foksworth
$ cat tst.awk
NF {
    tag = val = $0
    sub(/:.*/,"",tag)
    sub(/[^:]*:[[:space:]]*/,"",val)
    tag2val[tag] = val
    tags[++numTags] = tag
    next
}
{ prt() }
END { prt() }
function prt(   tagNr,tag,val) {
    OFS=","
    if ( ++numRecs == 1 ) {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            tag = tags[tagNr]
            printf "\"%s\"%s", tag, (tagNr<numTags ? OFS : ORS)
        }
    }
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        val = tag2val[tag]
        gsub(/"/,"\"\"",val)
        printf "\"%s\"%s", val, (tagNr<numTags ? OFS : ORS)
    }
    delete tag2val
    numTags = 0
}

$ awk -f tst.awk file
"dn","objectClass","cn","uid","creationTime","uidNumber"
"uid=asd,ou=People,dc=MY,dc=ORG","...","Adam Saddler","asd","20110409131545-0700","1234"
"uid=mfwth,ou=People,dc=MY,dc=ORG","...","Mike Foksworth","mfwth","20160704144535-0800","12345"
awk 'BEGIN{
      RS="\n\ndn: |,|\n"
      FS="[=:] *"
    }
    NF{a=a (a?",":"")$2}
    RT~/dn:/{print a;a=""}
    END{print a}' file