つれづれ電脳記(日くらしPCに向かひて)

つれづれなるままに、日くらしPCに向かひて、その悪戦苦闘ぶりをそこはかとなく書き付くるおじさん。たまに雑談[管理人:goosyun]

つれづれなるままに、日くらしPCに向かひて、デジタル関係の悪戦苦闘ぶりをそこはかとなく書き付くるおじさんです。
たまに雑談してます。連絡・問い合わせフォームは、ページ最下部に置いています。[著者(運営人):goosyun]

(当ブログには本文中に広告リンクが含まれています。)

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