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

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

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

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

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