パソコン悪戦苦闘記録

awkエラー「致命的:フィールド-1へのアクセスの試み」

 会社の仕事から解放された日曜日、自宅PCで
   プログラミング言語 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


 このテキストファイルから、各行(レコード)の第4フィールドと第5フィールドを抽出するには、次のとおり記述します。
 $ awk '{print $(NF-1),$NF}' awk_test.txt

 このスクリプトを実行すると、次のとおり出力されます。

ke ko
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日 再追記》
 訂正記事を書きました。
  こちらの記事をご覧ください。

コメント一覧

goosyun
narkejp さん
 さすがです。
 正解です。
 近日中に、訂正記事を書きます。
narkejp
たぶん、問題はテストデータのほうにありますね。フィールド数が0のレコードが入っていた?
私はテキストエディタでは必ず改行記号を表示するように設定しています。
名前:
コメント:

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

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

 

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

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

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