gpt4 book ai didi

awk 按字段名排列记录顺序

转载 作者:行者123 更新时间:2023-12-04 02:25:34 26 4
gpt4 key购买 nike

我正在编写一个 bash 脚本来将各种 LDAP 查询处理成管道分隔文件。一些结果记录不包括所有属性,并且每条记录的数据不以每条记录的相同属性顺序返回。我编写了脚本以确保所有记录都具有 4 个必要的属性,现在我正在尝试使用 awk 对输出记录的字段重新排序以匹配既定顺序。下面是我希望处理的一组示例记录,其中第一条记录代表所需的顺序/列标题。

cn: User ID
displayName: Display Name
LastLoginTime: Last Login
ExpirationDate: Exp Date

cn: mf_mdsa
displayName: NONE
ExpirationDate: 00000000000000
LastLoginTime: 20201220212738

displayName: NONE
cn: mf_cs
ExpirationDate: 00000000000000
LastLoginTime: 20201220212704

displayName: NONE
ExpirationDate: 00000000000000
LastLoginTime: 20181009205555
cn: OPERATOR

ExpirationDate: 00000000000000
displayName: HENNIE VAN DEVENTER
LastLoginTime: 20181030201447
cn: hvdevent

cn: A0S
displayName: LARA EVERWINE
ExpirationDate: 20190612001951
LastLoginTime: 20190313182136

cn: SODS822
ExpirationDate: 00000000000000
displayName: JAMES SIMS
LastLoginTime: 20210104000757

我正在调用一个 awk 脚本并输出到一个文件

BEGIN {FS=": "; OFS="|"}
$1 == "cn" {cn = $2}
$1 == "displayName" {displayName = $2}
$1 == "LastLoginTime" {LastLoginTime = $2}
$1 == "ExpirationDate" {
print cn,displayName,LastLoginTime,$2}

虽然所需的重新排序似乎正在发生,但一个记录中的字段值正在渗透到下一个记录中。我假设它与如何将字段标签和值添加到变量以提供打印有关,但我无法弄清楚如何在移动到下一个之前正确处理每条记录

User ID|Display Name|Last Login|Exp Date
mf_mdsa|NONE|Last Login|00000000000000
mf_cs|NONE|20201220212738|00000000000000
mf_cs|NONE|20201220212704|00000000000000
OPERATOR|NONE|20181009205555|00000000000000
A0S|LARA EVERWINE|20181030201447|20190612001951
SODS822|LARA EVERWINE|20190313182136|00000000000000
SODS822|JAMES SIMS|20190313182136|00000000000000

最佳答案

由于每组字段的顺序不同,您应该仅使用条件 !NF 在空行中写入完整记录(假设每 4 行后有一个换行符,如问题所示) :

cat rec.awk

BEGIN {FS=": "; OFS="|"}
$1 == "cn" {cn = $2}
$1 == "displayName" {displayName = $2}
$1 == "LastLoginTime" {LastLoginTime = $2}
$1 == "ExpirationDate" {expirationDate=$2}
!NF {if (cn != "") print cn,displayName,LastLoginTime,expirationDate; cn=""}
END {if (cn != "") print cn,displayName,LastLoginTime,expirationDate}

然后将其用作:

awk -f rec.awk file

User ID|Display Name|Last Login|Exp Date
mf_mdsa|NONE|20201220212738|00000000000000
mf_cs|NONE|20201220212704|00000000000000
OPERATOR|NONE|20181009205555|00000000000000
hvdevent|HENNIE VAN DEVENTER|20181030201447|00000000000000
A0S|LARA EVERWINE|20190313182136|20190612001951

关于awk 按字段名排列记录顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67930718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com