プログラミング言語 awk(オーク)
の勉強をしました。
今日(2024年6月23日)やったのは、テキストファイルから特定のフィールドを抽出して表示する「列選択」です。非常に基本的なawk操作と言えます。
次のテキストファイルがあります。
「awk_test.txt」というファイル名のテキストファイルです。
ka ki ku ke ko
sa si su se so
ta ti tu te to
ha hi hu he ho
sa si su se so
ta ti tu te to
ha hi hu he ho
このテキストファイルから、各行(レコード)の第4フィールドと第5フィールドを抽出するには、次のとおり記述します。
$ awk '{print $(NF-1),$NF}' awk_test.txt
このスクリプトを実行すると、次のとおり出力されます。
ke ko
se so
te to
he ho
se so
te to
he ho
これで成功です。
「NF」(number of fields)は、各レコードのフィールドの数が代入される組み込み変数です。そのため、$NFをprintすると、レコードの最後のフィールドが表示されます。
また、アクション内で演算が行われるので、NFから1を引いた値、$(NF-1)をprintすると、後ろから2番目のフィールドを表示できます。
ところが、私の場合、へんてこなエラーが出て実行されませんでした。
どのようなエラーかというと、
「awk: コマンドライン:1: (FILENAME=awk_test.txt FNR=7)
致命的: フィールド -1 へのアクセスの試みです」
このようなエラーメッセージです。
はて、さて、教科書どおりに記述しているのに、
(・・・のはずなのに、)なぜ実行されないのか。
ネット上の情報をさんざん探し回りましたが、答えは出てきません。
◆ オーバーヒートしたヲッサンの図
「ああでもない、こうでもない。」と考えていたら、スペック不足の私の頭脳がオーバーヒートして、ついには頭から湯気が立ち上がり始めました。
そこで、冷却のために散歩に出ました。
そうしたら、
「はっ! もしかしたら?」
と、ひらめきました。
awkの扱うテキストファイルは、「スペース」がデフォルトの区切り文字となっています。スペースでなくタブ記号で区切られていたから、awkはフィールドをきちんと認識できず、対処できなかったというわけです。
試しに、タブ記号をスペースに置き換えた上で、
上記スクリプトを実行するとぉ~
今度はうまくいきました。
さんざん苦労して自己解決したので、もう忘れません。完全に自分の知識として定着させることができました。
よかった、よかった。
なお、タブ記号で区切られたテキストファイルも、もちろんawkは扱うことができます。そのための対処策はちゃんと用意されています。
その関係は、また後日、勉強します。
◆ 改訂されたばっかりのawk教科書
それでは、また次の記事で。
■■■■ goosyun ■■■■
《2024年6月25日追記》
上記のエラーの原因は、「区切り文字」でないことが判明しました。
別の理由で発生したエラーでした。
近日中に、この記事の訂正記事を書くことにします。申し訳ありません。
《2024年6月29日 再追記》
訂正記事を書きました。
⇒ こちらの記事をご覧ください。