0

次の状況で AWK を使用するにはどうすればよいですか?

入力例:

17  mary@mysite.co.uk
9   Limited <office@domain.com>
8  "Fishing Forum" <dra.78@gmail.com>

望ましい出力:

17  mary@mysite.co.uk
9   office@domain.com
8   dra.78@gmail.com

$1 に各行の電子メール アドレスを出力したい。

4

4 に答える 4

2

可能なすべての電子メール オプション (トリプル コメントを参照) を処理するには、電子メールを正規表現と一致させる必要があります。

gawk --re-interval '{match($0,/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,4}/);print $1 " " substr($0,RSTART,RLENGTH)}'

ここから取得した正規表現: http://www.regular-expressions.info/email.html。テストして、すべての合法的な電子メールがカバーされていることを確認する必要があります。

于 2013-01-14T10:15:52.610 に答える
1

データが実際に表示されているほど単純な場合は、awksub()関数を使用して、不要なものに乗ることができます。

 awk '{
      # inside the implied awk process-all-lines-of-input-loop
      email=$0
      if (email ~ /<\.*>/) {
        sub(/^.*</,"", email)
        sub(/>.*$/,"", email)
      } 
      else { email=$2 }
      printf("%s\t%s\n", $1, email)
      }' mailFile > newMailFile

cat newMailFile
17      17  mary@mysite.co.uk
9       office@domain.com
8       dra.78@gmail.com

$0行全体( )を変数にコピーしてemailから、最初の文字まで左から始まるすべての文字を削除し、変数<の最後の最後の文字から始まる文字をすべて削除したことに注意してください。電子メールアドレスは、コーナーケースの解析がかなり複雑になる可能性があるため、この手法では一部のケースを見逃す可能性がありますが、単純さを考えると、十分なはずです。email>

また、awkとシェルプログラミングに慣れていない場合は、入力ファイルを同じ出力ファイル名で上書きできないことに注意してください。"のようなawk '....' file > fileことを試みないでください。基本的には消去され fileます。

printfは、データを印刷するための優れた方法で\tあり、2つのフィールドの間にタブ文字を表示します。を使用して、より簡単に行うこともできますprint $1 "\t" email

IHTH。

于 2013-01-14T02:30:39.640 に答える
0
$ cat stack 
17  mary@mysite.co.uk
9   Limited <office@domain.com>
8  "Fishing Forum" <dra.78@gmail.com>

$ cat stack | awk '{ print $1" "$NF }' | sed 's/<//g; s/>//g'
17 mary@mysite.co.uk
9 office@domain.com
8 dra.78@gmail.com

tab出力の最初の列の間に必要な場合は、次のように使用します。

$ cat stack | awk '{ print $1"\t"$NF }' | sed 's/<//g; s/>//g'
17  mary@mysite.co.uk
9   office@domain.com
8   dra.78@gmail.com

メールアドレスのみが必要な場合:

$ cat stack | awk '{ print $NF }' | sed 's/<//g; s/>//g'
mary@mysite.co.uk
office@domain.com
dra.78@gmail.com

参考: NF 1行のフィールドの総数を示します

于 2013-01-14T03:41:32.477 に答える
0

そのために「sed」を使用できます

$ ./test.sh | sed -r -e 's/<//g' -e 's/>//g' -e 's/^([0-9]+).* (.+)$/\1 \2/'
17 mary@mysite.co.uk
9 office@domain.com
8 dra.78@gmail.com
于 2013-01-14T11:41:26.970 に答える