Извлечение частей строки внутри скрипта awk - PullRequest
2 голосов
/ 14 марта 2020

Вот формат данных, с которым я работаю.

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. Надеюсь, я все правильно объяснил. Спасибо

1 Ответ

2 голосов
/ 14 марта 2020

по I would like to use a bash parameter expansion such as - awk не bash или любая другая оболочка, это совершенно другой / отдельный инструмент со своим собственным синтаксисом, семантикой и контекстом для переменных.

$ 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" }

в конце скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...