« 「gawk」の正規表現・・・続き | トップページ | 導通チェッカーに使うバナナジャック »

2019年2月11日 (月)

gawkの関数:「length」でつまづく!

MS-DOS時代の「jgawk」なら大丈夫なのに、Vectorでダウンロードした「gawk(3.1.5)」でアウト。
「正規表現」 は関係ありません。
おかしな挙動をしたのが「length」。
文字のバイト数を返す関数。
gawkで使うと、おかしなことが起こったんです。
検証のため、こんなテストプログラムを実行。
{
    n = length($0);           # 入力文字列のバイト数
    printf("n:%d\n", n)     # いったん確認
    r1 = "";                    # バッファをクリア
    for(i = 1; i <= n; i++){    # 入力文字数でloop
        c1 = substr($0, i, 1);     # 1文字取り出し
        r1 = r1 c1;                 # バッファに文字として結合
        printf("%s:%d\n",r1,length(r1));   # バッファの文字列とバイト数を表示
    }
}
これがgawkだと、
12345  ←入力文字
n:5    合ってる
1:1    ところが、増えていくはずが・・・
12:1
123:1
1234:1
12345:1   5文字ループしたのに「1」
abcdefg   7文字入力
n:7    合ってる
a:1    ところが・・・
ab:1
abc:1
abcd:1
abcde:1
abcdef:1
abcdefg:1  やはり1のままで違ってる
正しい値は・・・
行末の数字が1234・・・と+1ずつ増加しなくちゃなりません。


で、正しい答えを出す方法。
gawkのままで
 1:     r1 = r1 c1 "";           # 空文字を結合
 2:     printf("%s:%d\n",r1,length(r1 ""));   同じく
 3:     起動オプションに -W ctype=ASCIIを加える
             ctype=SJISだとダメ。
jgawkだとそのままでok
むちゃ悩んだぞ~~~っと。
どうしたものか。
※結果・・・
gawkのバージョンを上げるということで対応。(4.1.4に)
ここからダウンロード。
 
Free download of the version 4.1.4 (Aug 2016)
(Version 4.1.4)

Win32 executable

Version in English Version in English



※ところが・・・
4.1.4では日本語がアウト。
起動オプションも見当たらず。

|

« 「gawk」の正規表現・・・続き | トップページ | 導通チェッカーに使うバナナジャック »

パソコン・インターネット」カテゴリの記事

Help me! (助けて!)」カテゴリの記事

電子工作」カテゴリの記事

コメント

居酒屋ガレージ店主様

前略、

JH3DBO 様により、この JGAWK の 存在を教えて頂いた以降、私のお仕事上、多くの場面で、非常に助けられました。

全く、JH3DBO 様には感謝、感謝、感謝・・・であります。

紹介頂いた本は、この本になると思いますが、残念ながら、かなり前に絶版になってしまいましたね。

https://www.amazon.co.jp/%E5%85%A5%E9%96%80-JGAWK%E2%80%95%E3%82%B5%E3%83%B3%E3%83%87%E3%83%BC%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%80%E8%AA%9E%E5%9E%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%A4%89%E6%8F%9B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-%E4%BC%8A%E8%97%A4-%E5%8D%9A%E5%BA%B7/dp/4871931714/ref=sr_1_3?ie=UTF8&qid=1550050033&sr=8-3&keywords=jgawk

さて、ご存知かもしれませんが、私の知る限り、現在の最新版は

gawk 4.2 になっていると思います。
データのありかは、以下に存在している様です。

https://sourceforge.net/projects/ezwinports/files/

gawk-4.2.1-w32-bin.zip

マニュアルの保存場所は、下記にあります。

http://www.gnu.org/software/gawk/manual/

-----------------------------

こちらも、ある時まで使えていた AWKのスクリプトが
突如使えなくなってとても悩んだ事がありました。

原因を探した結果、エディターが保存していたコードが
UNICODE であったか、SJIS であったか・・みたいな事が
原因でうまく動作しなかった・・と言う記憶があります。

うまく使えると良いですね

お役に立っていれば嬉しいです。

投稿: JA3RMR | 2019年2月13日 (水) 18時49分

JH3DBO様

下記のソースコードした上で
プログラムの内容はJH3DBO 様の
記されたものはそのままにしてあります。

BEGIN{FS=" "}
{
n = length($0); # 入力文字列のバイト数
printf("n:%d\n", n) # いったん確認
r1 = ""; # バッファをクリア
for(i = 1; i <= n; i++){ # 入力文字数でloop
c1 = substr($0, i, 1); # 1文字取り出し
r1 = r1 c1; # バッファに文字として結合
printf("%s:%d\n",r1,length(r1)); # バッファの文字列とバイト数を表示
}
}


入力データを 全角文字のアルファベットとし

5

AB
ABC
ABCD
ABCDEF

u.txt はソースコード
n.txt は入力データ

gawk -fu.txt n.txt

で実行すると、

gawk: u.txt:9: (FILENAME=n.txt FNR=2) fatal: printf to "standard output failed (No space left on device)

と言うエラーメッセージがでるのですが、これを

gawk -fu.txt n.txt > abc.txt

と適当なファイル名にリダイレクトすると
エラー無で、下記の出力を出してくれました。

n:1
5:1
n:1
A:1
n:2
A:1
AB:2
n:3
A:1
AB:2
ABC:3
n:4
A:1
AB:2
ABC:3
ABCD:4
n:6
A:1
AB:2
ABC:3
ABCD:4
ABCDE:5
ABCDEF:6


ですが、これが、JH3DBO 様の
お悩みであった事なのでしょぅか ?

文字は切り出しが成功している様です。

私めの場合、出力を > でリダイレクト
する事で問題はなくなっていますので

(No space left on device)

は気にならなくなったので、原因究明作業は
進めておりません。


投稿: JA3RMR | 2019年2月14日 (木) 09時07分

Vectorの3.1.5は日本語が通ります。
ところが、4.2.1や4.1.4では日本語がアウト。
そして、4.2.1は「dll」が必要で、3.1.5や4.1.4のようにgawk.exe単独では動きません。

日本語も処理したいので、昔のjgawkかVectorのgawk3.1.5。
ところが3.1.5ではlengthがおかしな挙動。
この場合、空文字を付加すると解決できることを発見:length(r1 ""))

jgawkは「switch~case」に対応しておらずで×。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2019年2月14日 (木) 09時52分

JH3DBO 様

さすがですねぇ・深くチャレンジしておられる・・
恐れ入りました。

投稿: JA3RMR | 2019年2月14日 (木) 11時34分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: gawkの関数:「length」でつまづく!:

« 「gawk」の正規表現・・・続き | トップページ | 導通チェッカーに使うバナナジャック »