区切り文字が列の中に混ざっている表から共通の文字列をもとに列を抽出する

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

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
Sponsored Links

空白区切りのファイルなのに、ダブルクォーテーション等で囲みもせずに、文字列内に空白を含めているようなファイル。
このようなファイルから、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

 

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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*