web-dev-qa-db-ja.com

awkがこのラインを複数回印刷するのはなぜですか?

次のLDIFがあります。

dn: cn=Robert Smith,ou=people,dc=example,dc=com
objectclass: inetOrgPerson
cn: Robert Smith
cn: Robert J Smith
cn: bob  smith
sn: smith
uid: rjsmith
userpassword: rJsmitH
carlicense: HISCAR 123
homephone: 555-111-2222
mail: [email protected]
alias: [email protected]
alias: [email protected]
description: Nice hair
ou: Human Resources

dn: cn=John Doe,ou=people,dc=example,dc=com
objectclass: inetOrgPerson
cn: John Doe
cn: John Walker Doe
cn: Johnny
sn: Doe
uid: jdoe
userpassword: topsecret
carlicense: AKAHH 123
homephone: 123-458-362
mail: [email protected]
alias: [email protected]
alias: [email protected]
description: cool guy
ou: Sales
 _

今、私はそれに対してawkコマンドを実行しています:

awk '/^mail:/ { mail = $2 }; {print mail };' ldif
 _

予想される結果は次のとおりです。

[email protected]
[email protected]
 _

実際の結果は次のとおりです。

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
 _

AWKがこの出力を複数回与える理由は実際にはわかりません。私はawkに新たに慣れていたので誰かが私にそれを説明できたら私はそれを高く評価しています。私はすでにそのマンページとグーグルを相談しましたが、私はそこに間違ったことを探していると思います...

編集:AWKがテキストストリームを行に処理することを理解しています。私の "Print"は、LDIFファイルに行があるのと同じくらい頻繁に出力を印刷するだけです。しかし、どのようにしてawkをやらせるのを防ぐことができますか?それぞれの結果を一度印刷したいだけです。

2
Valentin

条件/^mail:/最初の命令には影響しません。最初のものだけ(mail = $2)。

その結果、2番目の命令(print mail)実行されますすべての行に対して

それが実際には出力の開始時にいくつかの空白行がある理由(mailはまだ設定されていません)。

これらのいずれかが機能します。

awk '/^mail:/ { { mail=$2 }; {print mail } };' ldif

awk '/^mail:/ { mail=$2; print mail };' ldif
 _

個人的には、

awk '/^mail:/ { print $2 }' ldif
 _
5
Dennis