gpt4 book ai didi

bash - 在 awk 脚本中提取部分字符串

转载 作者:行者123 更新时间:2023-12-04 10:24:29 24 4
gpt4 key购买 nike

这是我正在使用的数据格式。

jmontgomery:Janet:Montgomery:(312)213-9876:JanetMontgomery@live.com
gstefani:Gwen:Stefani:(123)456-7890:GwenStefani@compuserv.edu
linusT:Linus:Torvadis:(987)654-3210:ltoradis@linux.org
tux:Arch:Linux:(314)921-3071:arch1@archlinux.org

这是我想要的输出。
dn: uid=jmontgomery email=JanetMontgomery@live.com domain=JanetMontgomery@live.com
cn:Janet Montgomery
sn:Montgomery
telephoneNumber:(312)213-9876

dn: uid=gstefani email=GwenStefani@compuserv.edu domain=GwenStefani@compuserv.edu
cn:Gwen Stefani
sn:Stefani
telephoneNumber:(123)456-7890

dn: uid=linusT email=ltoradis@linux.org domain=ltoradis@linux.org
cn:Linus Torvadis
sn:Torvadis
telephoneNumber:(987)654-3210

dn: uid=tux email=arch1@archlinux.org domain=arch1@archlinux.org
cn:Arch Linux
sn:Linux
telephoneNumber:(314)921-3071

还有我的脚本:
BEGIN { FS=":"; ORS="\n\n" }
{ print "dn: uid="$1, "email="$5, "domain="$5 "\n" "cn:"$2,$3 "\n" \
"sn:"$3 "\n" "telephoneNumber:"$4 }
END { print "ALL DONE" }

我只想将电子邮件地址的域放在 "domain="$5 所在的位置。
我想使用 bash 参数扩展,例如
"${$5##*@}"

但它不会让我这样做。我什至试图将 FS 从 FS=':' 更改为 FS='@' 但我怎么能只对电子邮件地址这样做,并且只有在它已经被处理一次之后。我我不反对使用简单的 bash 命令,例如 [cut -f2 -d"@"] 但我怎么能在 awk 脚本中运行它。我希望我能正确解释这一点。谢谢

最佳答案

wrt I would like to use a bash parameter expansion such as - awk 不是 bash 或任何其他 shell,它是一个完全不同/独立的工具,具有自己的语法、语义和变量上下文。

$ cat tst.awk
BEGIN { FS="[:@]" }
{
printf "dn: uid=%s email=%s@%s domain=%s\n", $1, $5, $6, $6
printf "cn:%s %s\n", $2, $3
printf "sn:%s\n", $3
printf "telephoneNumber:%s\n", $4
print ""
}

$ awk -f tst.awk file
dn: uid=jmontgomery email=JanetMontgomery@live.com domain=live.com
cn:Janet Montgomery
sn:Montgomery
telephoneNumber:(312)213-9876

dn: uid=gstefani email=GwenStefani@compuserv.edu domain=compuserv.edu
cn:Gwen Stefani
sn:Stefani
telephoneNumber:(123)456-7890

dn: uid=linusT email=ltoradis@linux.org domain=linux.org
cn:Linus Torvadis
sn:Torvadis
telephoneNumber:(987)654-3210

dn: uid=tux email=arch1@archlinux.org domain=archlinux.org
cn:Arch Linux
sn:Linux
telephoneNumber:(314)921-3071

如果您真的想在处理完成后打印“ALL DONE”,那么我强烈建议您将其打印到 stderr,而不是将它与将要输出到 stdout 的正常输出混合。要做到这一点,请添加:
END { print "ALL DONE" | "cat>&2" }

在脚本的末尾。

关于bash - 在 awk 脚本中提取部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60683493/

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