我有一个LDIF文件,其中约有23K的用户对象用空白行分隔。每个用户对象(文件中的文本块)都有一个workforceid值,我想删除具有5个字符的workforceid的所有用户对象的用户对象(整个文本块)。有来自两个不同公司的用户对象,一个公司的ID为5位数字,其他公司的ID为8位数字,我需要对ID为8位的用户对象进行数据处理。数据集示例:
# zhayangy, Company
dn: cn=zhayangy,o=Company
workforceid: 26000180
street: 699 axian Road
st: Shanghai
preferredname: Zhao, Yangyang
physicaldeliveryofficename: ABC01:
ou: IT Engineering
mail: yangyang.zhao@sample.com
givenname: Yangyang
fullname: Yangyang Zhao
employeetype: Cont
employeestatus: Active
costcenter: ABCD501641
companycategory: abc.com
co: China
city: Shanghai
uid: zhayangy
sn: Zhao
cn: zhayangy
objectclass: inetOrgPerson
objectclass: ApplicationAttrs
objectclass: organizationalPerson
objectclass: Person
objectclass: LoginProperties
objectclass: Top
objectclass: PasswordUser
objectclass: UserAux
objectclass: FolderUser
objectclass: eSystem
objectclass: pwUser
objectclass: AuthAttrs
# mikhaylo, Company
dn: cn=mikhaylo,o=Company
workforceid: 76000838
street: Gradskoe shoe, 11A block 1
preferredname: Mikhaylov, Vladislav
postalcode: 12345
physicaldeliveryofficename: ABW02:
ou: Presales ABCE
mail: vladislav.mikhaylov@sample.com
givenname: Vladislav
fullname: Vladislav Mikhaylov
employeetype: Employee
employeestatus: Active
costcenter: ABCA500189
companycategory: abc.com
co: Russian Federation
city: Moscow
uid: mikhaylo
sn: Mikhaylov
cn: mikhaylo
objectclass: inetOrgPerson
objectclass: ApplicationAttrs
objectclass: organizationalPerson
objectclass: Person
objectclass: LoginProperties
objectclass: Top
objectclass: PasswordUser
objectclass: UserAux
objectclass: FolderUser
objectclass: eSystem
objectclass: pwUser
objectclass: AuthAttrs
使用以下命令将搜索返回所有具有workforceid的记录,但是我认为只有在工作人员ID是第二个条目的情况下。最好有一个命令来查找劳动力编号并计算值的长度,而不管它在对象中的位置如何。
基本上,我需要一些如何增加对长度的检查,例如:if(length($ 2)== 5),但是$ 2是文本块中的第二行,而不是workforceid行中的第二列,或者柱。认真对待您的看法。
awk -v RS='' '/workforceid/ {if ( length($7) == 5 ) print $0}' ORS='\n\n' fullextract.ldif
预先感谢
答案 0 :(得分:1)
您感兴趣的ID是$ 4,而不是$ 2或$ 7,您需要的是:
awk -v RS= -v ORS='\n\n' 'length($4) == 8' fullextract.ldif
您可以只打印字段以查看该内容。
如果可以在任何地方:
awk -v RS= -v ORS='\n\n' '/(^|\n)workforceid: [0-9]{8}(\n|$)/' fullextract.ldif
使用tag: value
对处理数据问题的更可靠,更通用的方法是创建一个存储它们的数组,然后对该数组进行操作,例如:
awk '
NF {
rec = rec $0 ORS
tag = val = $0
sub(/:.*/,"",tag)
sub(/[^:]+: /,"",val)
tag2val[tag] = val
next
}
{ prt(); rec=""; delete tag2val }
END { prt() }
function prt() {
if ( length(tag2val["workforceid"]) == 8 ) {
print rec
}
}
' file
在其他字段上添加其他测试,仅打印特定的字段等是很简单的。对于您的特定数据,如果要测试或打印,则必须处理所有具有相同标签的“ objectclass”字段它们可以单独处理,但是很容易处理(例如,添加一个计数器来唯一标识val2tag[]
中的每个对象,或者为它们单独标识一个单独的数组,可以按它们的值进行索引,以便您可以轻松地使用in
来测试它们的存在),但您希望对其进行处理。
答案 1 :(得分:0)
我认为经过测试我在这里得到了答案。如果我错了,请告诉我。我不确定这是正确的,但我将“ workforceid”移动到了对象中的其他位置,并且计数也相同。所以我想得到了。
awk -v RS='' '/workforceid/ {if ( length($7) == 5 ) print $0}' ORS='\n\n' fullextract.ldif
答案 2 :(得分:0)
我很惊讶这行得通。 $7
似乎不是劳动力编号。无论如何,这是我的解决方案:
awk -v RS='' -v ORS='\n\n' '/workforceid: [0-9]{8}/' ldif
换句话说,如果劳动力ID由八位数字组成,则打印记录,否则不打印。