ちょっとテキストファイルをいじってたところ、以下のようなファイルがあった。

blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
a01 a02@aaa.com a03 a04 a05
b01 b02 @bbb.com b03 b04 b05
c01 c 02 @ccc.com c03 c04 c05
d01 d02@ddd.com d03 d04 d05
e01 e 0 2 @eee.com e03 e04 e05

空白区切りのファイルなのに、ダブルクォーテーション等で囲みもせずに、文字列内に空白を含めているようなファイル。 このようなファイルから、2列目、3列目を抽出したいということがあった。 で、見てわかるように2列目はメールアドレスに相当するため、形式としては「~@domain.name」といった形式になる。 このため、以下のようにawkで指定して抽出することができる。

awk '{for(i=2;i<=NF;i++) if(match($i,"@*.com")) {for(x=2;x<i;x++){printf $x" "};print $i","$(i+1)}}'
a01 a02@aaa.com a03 a04 a05
b01 b02 @bbb.com b03 b04 b05
c01 c 02 @ccc.com c03 c04 c05
d01 d02@ddd.com d03 d04 d05
e01 e 0 2 @eee.com e03 e04 e05
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | awk '{for(i=2;i<=NF;i++) if(match($i,"@*.com")) {for(x=2;x<i;x++){printf $x" "};print $i","$(i+1)}}'
a02@aaa.com,a03
b02 @bbb.com,b03
c 02 @ccc.com,c03
d02@ddd.com,d03
e 0 2 @eee.com,e03
blacknon@BS-PUB-UBUNTU-01:~$ # ダブルクォーテーションでくくる
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | awk '{for(i=2;i<=NF;i++) if(match($i,"@*.com")) {for(x=2;x<i;x++){a=a$x" "};a=a$i;print "\""a"\","$(i+1)}a=""}'
"a02@aaa.com",a03
"b02 @bbb.com",b03
"c 02 @ccc.com",c03
"d02@ddd.com",d03
"e 0 2 @eee.com",e03

まぁ、こんな行儀の悪いデータそうそう無いとは思うが、もしあったときはこんな感じで列を抽出できる。