awkでパターン検索を印刷する前に文字列を追加する方法

awkでパターン検索を印刷する前に文字列を追加する方法

申し訳ありません。この簡単な質問に対する答えが見つからないようです。我々は、多数の電子メールを含むファイルを持っています。

<To: [email protected]>
<Cc: [email protected]>
<From: [email protected]>

hello person here is random text

待って、20以上のメールを繰り返してください

先生は生徒がawkからEメールを含む行を印刷し、最初に「email =」を追加したいと思います。彼のヒントは、To:From:とCc:をパターン検索として使用することです。彼の理想的な出力は

email = [email protected]
email = [email protected]
email = [email protected]

しかし、その人もかかるでしょう。

email = <To: [email protected]>
email = <Cc: [email protected]>
email = <From: [email protected]>

後者の例を印刷することができます。 (各例ではジャンク文字を削除する方法がわかりません。電子メールごとに一貫していません。)しかし、どのように追加しますかemail =

これまで私

awk '/To:|From:|Cc:/ {print}' file

私も他の多くの奇妙なことを試しましたが、彼らは私に構文エラーを与えました。

ありがとうございます!

答え1

以下が必要なことをしているようです。

awk '/To:|From:|Cc:/ {$2=substr($2,1,length($2)-1); print "email = ", $2 }' file

この時点で:

{$2=substr($2,1,length($2)-1)

と同様に、文字列の2番目の要素を取得し、[email protected]>最後の文字を削除します>

"email = "その後、編集した2番目の要素と一緒に希望の文字列を印刷します$2

print "email = ", $2

結果は次のとおりです。

email =  [email protected]
email =  [email protected]
email =  [email protected]

印刷の仕組みをよく理解することをお勧めします。https://www.gnu.org/software/gawk/manual/html_node/Print-Examples.html

答え2

注文する

awk -F ":" '/To|Cc|From/{gsub(">","",$2);print "email ="$2}' ファイル名

出力

email = [email protected]
email = [email protected]
email = [email protected]

Python

#!/usr/bin/python
import re
k=re.compile(r'To|Cc|From')
q=open('filename','r')
for i in q:
    if re.search(k,i):
        w=i.split(":")[1].replace(">","")
        print "email = {0}".format(w).strip()

出力

email =  [email protected]
email =  [email protected]
email =  [email protected]

答え3

目標が学習であれば、試してみることがawkできる他の機能があります。これはファイル形式によって多少異なりますが、他の答えも同様です。

awk -F'>|<| ' -v OFS=" = " '/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file

E-mail = [email protected]
E-mail = [email protected]
E-mail = [email protected]

まず、入力フィールド区切り文字を-F拡張正規表現(ERE)に設定して入力行を分割$0する<>

-F'>|<| ' 

これにより、Eメールアドレスの末尾の余分な文字が削除されますが、スペースのままにし$1(先行による<$2フィルタフィールドとEメールアドレスを含め、末尾に$3スペースを含めます(末尾のため)。$4>

その後、怠惰に出力フィールド区切り文字を設定して、フィールド=範囲を印刷するたびにデフォルトの動作をフィールド間では=なく挿入にすることができます。

-v OFS=" = " 

フィルタリングは同じ$0ですが、印刷時に入力文字列を$04(およびフィールド数、特殊awk変数NF= 4)に分割したため、印刷しようとしています。この場合も$3同様です。$(NF-1)

'/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file

フィルタフィールドを明示的に抽出したので、必要に応じて明示的な$0一致を見つけて、他の場所で誤って一致することを防ぐことができます。$2

'$2=="To:"||$2=="From:"||$2=="Cc:"{......

関連情報