若我将字段归零,为什么awk会进行不同的OFS解析?
通过增加可靠分隔符上的计数器来解析多行“记录”(将使用sed的若我将字段归零,为什么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"]=$
/^$/
)
解析如下所示的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