見出し画像

パソコン悪戦苦闘記録

awkエラー「フィールド-1へのアクセスの試み」の原因

 テキストファイルを編集加工できるプログラミング言語awkを使って、一部のフィールドを抜き出そうとしたところ、エラーが出て実行されないという記事を、先日書きました。
 
 その記事は、こちらです。
  ⇒ 2024年06月23日付け記事「awkエラー」

 エラーメッセージの内容は、「致命的:フィールド-1へのアクセスの試み
というものです。

 やろうとしたことは次のとおりです。
 「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スクリプトを次のとおり記述しました。
 $ awk '{print $(NF-1),$NF}' awk_test.txt

 このスクリプトを実行すると、次のとおり出力されます(・・・のはずです。)

ke ko
se so
te to
he ho
 

 ところが、うまくいきません。
 上記の「致命的:フィールド-1へのアクセスの試み」のエラーが出ます。

 その後、あれこれと考えて、エラー原因を探り、ようやく答えを見つけました。

 なお、先日の2024年06月23日付けの記事においては、各フィールドをスペースではなく、タブで区切ったことがエラー原因としていました。ところが、それは原因ではありませんでした。理由は別のところにありました。

 では、いったい何が原因だったのか。
 それは、テキストファイルの中に、フィールド数が0の行(レコード)が紛れていたからです。
 フィールド数が0のレコードについては、
「$(NF-1)」フィールドが「$(0-1)」となって、
すなわち、-1のフィールドを意味します。
 -1のフィールドはないから、当然、エラーとなります。
 まさに、「致命的:フィールド-1へのアクセスの試み」というエラーメッセージそのものです。





 先日の私のブログ記事を見て、的確に誤りの原因・理由を指摘してくれた方がいます。
 narkejp さんって方です。
 フィールド数が0のレコードがあることは、記事中には出ていない情報なのに、その原因究明ができたことに、ほとほと感心しました。識者からしたら、そういうものなんでしょう。さすがとしか、言いようがありません。
 素人には及ばないところです。


 今後のエラー回避のために、スクリプトを次のとおり改良しました。
  $ awk 'NF>=2{print $(NF-1),$NF}' awk_test.txt

 上記のとおり、「NF>=2」というパターンを加えました。
 これで、フィールド数が2以上のレコードのみしか、アクションの対象になりません。素人の考えだから、不十分な回避策かもしれませんが。




それでは、また次の記事で
goosyun
名前:
コメント:

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

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

 

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

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

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