目次 に戻る

1009 awk intro sample 004;awk -f awkscr file

GNU Awk 3.0.6 + multi-byte extension 1.15

レコード と フィールド

前準備

次の 様な データ の 場合は フィールドが カンマで 区切られている

Pmt> cat test 
Stephan David,UGHI Corp. , 325 5th Ave.,Brliinton,MA 0587964,558-8701
Richard Givson,Etr Inc.,985 Mountain St.,Basement,MA 0879579,416-9761
John Zaggett, Durban Company, Inc.,341 King Road Plymouth ,MA 96662,023-4795
Alice Dord,Nasge Cat, Inc.  ,22 East Broadway Richmond, VA 09505,087-6479
Orville Hpomas,Nojia Corp ,11345 Oak Bridge Road, Tulsa, OK 34090,036-1257
Teddy Calcas,MAcyst Inc. ,402 Lans Road, Beaver Falls, PA 58702,078-9416
Eric Aduzeds,HGE Inc.  ,20 Post Road, Sudbury, MA 79825,035-7169
Hubert Slkmu,Alhcoa Inc.  ,328A Brook Road, Roanoke, VA 58796,081-4697
Amy Welfd,Jazz Sifood Inc.,334 Bayshore Pkwy, Mountain View, CA 21789,071-2845
Sal Karpenter,Rasar Inc. ,73 6th Street, Boston ,MA 87632,073-1876

awkscript

awk スクリプト を 見ておこう

Pmt> cat awkscr 
# phonelist.awk -- print name and phone number..
# input file -- name,company,street,city,state and zip,phone
BEGIN { FS = "," }              # comma-delimited fields
{       print ""                # output blank line
        print $1 "\t" $6        # name
}

試す

Pmt> awk -f awkscr test 

Stephan David   558-8701

Richard Givson  416-9761

John Zaggett    023-4795

Alice Dord      087-6479

Orville Hpomas  036-1257

Teddy Calcas    078-9416

Eric Aduzeds    035-7169

Hubert Slkmu    081-4697

Amy Welfd       071-2845

Sal Karpenter   073-1876

データーの区切りは カンマ 出力の ”$1”と”$6”の間は”tab” と した 以外は 取り立てて どうこう ということでは 有りませんが もう少し データー の 範囲を 狭めたい場合は どうするか、 ここで 5番目の フィールド に ”MA” と有るものを 対象に したい場合は

抜き出す範囲を 絞る その1

抜き出す範囲を 絞るために awkscr を 変更しよう この様にした。

Pmt> cat awkscr 
# phonelist.awk -- print name and phone number..
# input file -- name,company,street,city,state and zip,phone
# Select Include MA 
BEGIN { FS = "," }
/MA/ {  print "\n" $1 "\t" $6 }

試す

どうなるでしょうか?

Pmt> awk -f awkscr test 

Stephan David   558-8701

Richard Givson  416-9761

John Zaggett    023-4795

Teddy Calcas    078-9416

Eric Aduzeds    035-7169

Sal Karpenter   073-1876

これは これで 良いのですが 例えば カンマで区切られた 5番目の フィー ルド で ”MA”が 有るもの という のが 望んでいたとすると 1個 多く 抜き 出された 事に なります

Pmt> cat test 
Stephan David,UGHI Corp. , 325 5th Ave.,Brliinton,MA 0587964,558-8701
Richard Givson,Etr Inc.,985 Mountain St.,Basement,MA 0879579,416-9761
John Zaggett, Durban Company, Inc.,341 King Road Plymouth ,MA 96662,023-4795
Alice Dord,Nasge Cat, Inc.  ,22 East Broadway Richmond, VA 09505,087-6479
Orville Hpomas,Nojia Corp ,11345 Oak Bridge Road, Tulsa, OK 34090,036-1257
Teddy Calcas,MAcyst Inc. ,402 Lans Road, Beaver Falls, PA 58702,078-9416
Eric Aduzeds,HGE Inc.  ,20 Post Road, Sudbury, MA 79825,035-7169
Hubert Slkmu,Alhcoa Inc.  ,328A Brook Road, Roanoke, VA 58796,081-4697
Amy Welfd,Jazz Sifood Inc.,334 Bayshore Pkwy, Mountain View, CA 21789,071-2845
Sal Karpenter,Rasar Inc. ,73 6th Street, Boston ,MA 87632,073-1876

もう一度 ”awkscr” を 見てみると

Pmt> sed -e '/^#/d' awkscr 
BEGIN { FS = "," }
/MA/ {  print "\n" $1 "\t" $6 }

デリミタ は カンマ です というのが 最初の 行 ”BEGIN”で 処理を し ています 。次の 行は なにか ”MA”という 文字列を 含む 行 にたいして 最初 1行 送りなさい ”\n”、そうして その後に 該当する 行に対して 1番最初の フィールドを 出力 、次に タブを 出力 ”\t”、そうしてその後に 6番目のフィー ルドを 出力 しなさい、ということです。 ここで 上記の 場合は 行に 対して ” MA”を含む 場合に 対する 処理を 行っているが フィールドの 5番目に 対して という条件は 有りません。その場合は 何か条件を 追記 せねば いけん という ことです。

ということで もう少し awkscr を 変更 すると

Pmt> cat awkscr 
# phonelist.awk -- print name and phone number..
# input file -- name,company,street,city,state and zip,phone
# Select Include MA 
BEGIN { FS = "," }
$5 ~ /MA/ {     print "\n" $1 "\t" $6 }

ほんで もって

Pmt> cat awkscr 
# phonelist.awk -- print name and phone number..
# input file -- name,company,street,city,state and zip,phone
# Select Include MA 
BEGIN { FS = "," }
$5 ~ /MA/ {     print "\n" $1 "\t" $6 }

試すと

Pmt> awk -f awkscr test 

Stephan David   558-8701

Richard Givson  416-9761

John Zaggett    023-4795

Eric Aduzeds    035-7169

Sal Karpenter   073-1876

というふうに するようです。

!~ バンチルド

最後に !~ バンチルド を 使ってみよう 結果の 予測は つくだろうか?

Pmt> cat awkscr 
# phonelist.awk -- print name and phone number..
# input file -- name,company,street,city,state and zip,phone
# Select Include MA 
BEGIN { FS = "," }
$5 !~ /MA/ {    print "\n" $1 "\t" $6 }

結果は

Pmt> awk -f awkscr test 

Alice Dord      087-6479

Orville Hpomas  036-1257

Teddy Calcas    078-9416

Hubert Slkmu    081-4697

Amy Welfd       071-2845

予測した通りだろうか ルールを逆に できるようである。

にゃんたろう 拝!
GNU Awk 3.0.6 + multi-byte extension 1.15
2006年12月28日 (木) 22:08:18 JST 作成


目次 に戻る

Copyright © 2004.-2007. nyantarou All Rights Reserved.