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では日本語がアウト。
起動オプションも見当たらず。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- ガレージPCがぁ~(2025.07.10)
- VZ Editorのフロッピーディスク(2024.11.29)
- インピーダンスの歌(2024.08.19)
- イチケンさんの動画に居酒屋ガレージ日記(旧ページ)が(2024.03.27)
- メモ:crane1000.com(2023.08.02)
「Help me! (助けて!)」カテゴリの記事
- あかんやん「Microchip Studio」(2025.06.13)
- Microchip StudioでMPLAB@Snapが動かない(2025.06.12)
- オムロンのタイマー「H7ET-FBV」のGATE入力回路はどうなっているの?(2025.04.24)
- 2.0mmピッチの電線対電線接続用コネクタ(2024.12.11)
- この「テープ」は何という名前?(2024.10.01)
「電子工作」カテゴリの記事
- ひさしぶりのイベントだったけど・・・「ピコピコ・スイッチ」破損(2021.12.13)
- 顕微鏡用LEDリングライトのLED、そろそろ交換か(2021.09.27)
- 可変抵抗器の「陽極酸化」(2021.09.22)
- 弾帯状になったQIコネクタのコンタクトピンを・・・(2021.08.27)
- AD620を使った計装アンプとシミュレーテッド・インダクタを使ったノッチフィルタ(2021.08.16)
「AWK(GAWK)」カテゴリの記事
- 新しいGAWK --csvオプションで””の中のコンマを区別してくれる(2025.02.25)
- BSch3V CE3ファイルからコメント文字をピックアップ(2022.11.09)
- 「トラ技」の記事検索(2022.08.31)
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
- gawk 文字列から1文字を取り出して8bit数値として扱いたい(2020.10.21)
コメント
居酒屋ガレージ店主様
前略、
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分