その記事は、こちらです。
⇒ 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 ■■■■
最近の「Ubuntu」カテゴリーもっと見る
最近の記事
カテゴリー
バックナンバー
人気記事