パソコン悪戦苦闘記録

awkコマンドの複数アクションの区切り文字

 Ubuntu Linuxawk(オーク)コマンドを使用するとき、複数のアクションを記述しようとして、各アクションの間に入れる区切り文字が分からなくなりました。
 ネットで調べたところ、答えは、「;」(セミコロン)でした。

 詳しくは、
  ⇒ こちらの記事をご覧ください。



 手元に、awkの教科書
  「プログラミング言語 AWK(第2版)」
があるので、改めて同書で、その点を調べてみました。
 答えは、12ページ目に書かれていました。

  「アクションとは改行やセミコロンで区切られた文が並んだものだ。
と、このように解説されています。

 「あれ?
  セミコロンのほかに、改行でもいいのか。」と分かりました。
 んで、さっそく試してみました。




 
 用いるのは、前回記事と同じ具体例です。

 名簿テキストファイル(hoge.txt)に、次のように、各人の点数を保存します。

1 tanaka 34
2 kawano 75
3 nakano 44
4 yamada 56
5 yosida 62


 そして、各人の点数と合計点を表示させるために、コマンドラインに次のように記述します。
awk '{print $2"さんは"$3"点";i=i+$3}END{print "合計点は"i"点"}' hoge.txt
 
 その上で、セミコロン(;)を改行に置き換えるために、上記コマンド記述中、セミコロンを削除し、Enterキーを押してみました。
 そうすると、ここで、エラーが出ます。
 あれ?ってなりましたが、このエラーは当然です。Enterキーはコマンドを実行するためのキーだからです。つまり、(そこに改行を入れるためにEnterキーを押したのですが、)改行は挿入されずに、コマンドが実行されてしまいます。セミコロンを削除した不完全なコマンドだから、当然、エラーが出ます。

 つまり、コマンドラインに複数のアクションを記述するときには、各アクション文を区切るのに改行は使えないということです。
 実は、アクション文の区切り文字に改行が使えるのは、スクリプトを別個のファイルとする場合なのです。

 awkコマンドのスクリプト部分を別個のファイルとするために、次の内容のテキストファイルを作りました。

{
 print $2"さんは"$3"点"
 i=i+$3
}
END{
 print "合計点は"i"点"
}


 このテキストファイルを、「goukei.awk」というファイル名で保存します(ファイル名は「任意」のもので可)。これがスクリプトファイルです。

 次に、ターミナルを起ち上げて、コマンドラインに次のとおり打ち込みます。
$ awk -f goukei.awk hoge.txt

 これを実行すると、望みどおりの結果が得られます。
 実行結果は、次のとおりです。

tanakaさんは34点
kawanoさんは75点
nakanoさんは44点
yamadaさんは56点
yosidaさんは62点
合計点は271点


 awkの -f オプションにより、指定されたファイルからスクリプトを読み込むわけです。
 ちなみに(余談ですが)、このように、スクリプトを別個のファイルとするときは、前後にシングルクォーテーションを付ける必要はありません(これに対して、コマンドラインに記述するときは、シングルクォーテーションで囲むことが必要)。

 このスクリプトファイルに複数のアクションを並べるとき、改行を用いることができます。一行ごとに一つのアクションとなるので、読みやすいファイルとなります。
 ですから、長いスクリプトの場合は、コマンドラインに直接記述せず、別個のスクリプトファイルとするのがよいようです。



awkの基本教科書


それでは、また次の記事で
goosyun

コメント一覧

goosyun
narkejp さん
 コメント、ありがとうございます。

 「あとは、どんなテキストデータを常用するか」
 ・・・そうです、それが問題です。
 awkは会社業務でも使う場面がない、
 (awk導入を、会社は許諾してくれそうにない)
 ましてや、自宅でも必要とされてない。
 けど、
まぁ、知識として覚える楽しさは感じています。
 当面、
初老のヲッサンのボケ防止策、
自己満足の勉強材料としましょうか。
narkejp
いよいよスクリプトファイルの登場ですね。学習が進むとその分だけ便利さが増えてくるのが awk の特長かと思います。例示のような内容だと Excel 上でもできますが、さすがに例えば10年分の goo-blog のバックアップデータを処理するなんてのは現実的ではないでしょうから、こうしたスクリプト言語を覚えておく価値はあると思います。あとは、どんなテキストデータを常用するかにもよるでしょうか。
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「Ubuntu」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事