次の状況で 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 に各行の電子メール アドレスを出力したい。
次の状況で 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 に各行の電子メール アドレスを出力したい。
可能なすべての電子メール オプション (トリプル コメントを参照) を処理するには、電子メールを正規表現と一致させる必要があります。
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。テストして、すべての合法的な電子メールがカバーされていることを確認する必要があります。
データが実際に表示されているほど単純な場合は、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。
$ 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行のフィールドの総数を示します
そのために「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