awkの練習

awkはあるテキストを一行づつ読み込んで、それを加工してテキストを出力する処理に適している。ここでは以下のようなファイル”01.txt”を考える。

このファイルを以下のようにしたい。

まず01.txtには空行が含まれるのでこれを削除したい。しかし実際には空行ではなくてスペースが一個含まれているのでその行を削除したい。

その前に基本の整理。以下のようにawkを実行すると、元のファイルがそのまま表示される。

このコマンドの意味は、01.txtから一行ずつ読み込んで、それをprintで表示するという意味になる。これは以下のように書いても同じ。

$1とか$2にすると、その行がコマンドライン引数で渡られているかのように、$1,$2に入っていく。

aが含まれる行を表示するには以下のようにする。

こうすると、printが実行されるのはaが含まれる行だけになる。aが含まれない行を表示するには以下のようにする。

なので、スペースだけが含まれる行でない行だけ表示するには以下のようになる。

^は行の最初をあらわし、$は行の最後をあらわすのでその間にスペース一個入れておけば、スペースだけ含んだ行になる。
これを実行して02.txtにする。

本当の空行も削除して、03.txtにする。

ここからは本格的にやらないといけないので、コマンドラインではなく、ファイルにプログラムを書いて実行する。
その前に基本ちしき。
以下の文

これは以下と同じ。

myawkはファイルで中身は以下

よってmyawkでうまくプログラムを書いて目的を達成したい。
まず、元のファイルは3つの部分、開始時間、終了時間、テキストに分かれるて、これを時刻の行とテキストにする。まずは時刻の行を考えて以下のようにする。

awkは変数はいきなり使うことができる。文字列の連結は文字列を並べて書くことで行う。+を使うと算数の足し算のように頑張ってしまうので駄目。
次にテキストの行を考えて以下のようにした。

$1と$2に空文字を設定すると、$0からそれらが消える。しかしそれでも先頭にスペースが入ってしまうのでsub組み込み関数でそれらを取り除いて表示する。最後に空行を表示して完成した。

最後に上記のすべてを一行でやると以下のようになる。

上記のすべては自分の目的のためだけ+awkの勉強のためなのでここに書いてあることはかなりいいかげんか冗長で汎用性のないものなので注意してください。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)