gawkの関数:「length」でつまづく!
MS-DOS時代の「jgawk」なら大丈夫なのに、Vectorでダウンロードした
「gawk(3.1.5)」でアウト。
「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)); # バッファの文字列とバイト数を表示
}
}
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」
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のままで違ってる
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 4.1.4)
Win32 executable
Version in English
※ところが・・・
4.1.4では日本語がアウト。
起動オプションも見当たらず。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- メモ:crane1000.com(2023.08.02)
- Gigazineの記事「DDR Type 2の内部構造がすごい」(2023.01.10)
- 廃棄する本や説明書、データーブックなど(2021.03.20)
- CR2032バックアップ用リチウム電池・・・0V(2020.09.17)
- エライこっちゃ。ネットも電話もできない!! (2020.07.10)
「Help me! (助けて!)」カテゴリの記事
- 「アラルダイト」が無い!(2023.12.05)
- 2つあるワンショットマルチの時定数比を一定にしたい(2023.10.21)
- TRWの16pin DIP IC「8543」 これは何?(2023.10.06)
- 入力セレクタ+VR+トーンコントロール用IC、何かないかな?(2023.10.02)
- 電磁石の接触面の状態で保持力が変わるの?(2023.09.28)
「電子工作」カテゴリの記事
- TRWの16pin DIP IC「8543」 これは何?(2023.10.06)
- 予告:「マイコン型導通チェッカー」「電池電圧チェッカー」値上げします(2022.11.16)
- 三和の針式テスター「GP-5」不調(2022.10.18)
- 「ダイソー ミニケース 5個組」が見つからない #2(2022.10.12)
- 「ダイソー ミニケース 5個組」が見つからない(2022.09.29)
「AWK(GAWK)」カテゴリの記事
- BSch3V CE3ファイルからコメント文字をピックアップ(2022.11.09)
- 「トラ技」の記事検索(2022.08.31)
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
- gawk 文字列から1文字を取り出して8bit数値として扱いたい(2020.10.21)
- ダイソーReVOLTES単3 JIS C8708:2019充放電試験途中経過(2020.03.05)
コメント
居酒屋ガレージ店主様
前略、
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
A
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分