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

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

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

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

「プログラミング言語AWK」の初版を入手

 たまたま、書籍「プログラミング言語AWK(エイホ、カーニハン、ワインバーガー 共著、足立高徳 訳)の初版を手に入れました。
 1989年株式会社トッパンから発行されたものを、株式会社新紀元社復刻したものです。

書籍「プログラミング言語AWK」の初版

 私はすでに本書の第2版を購入しているから、初版は必要ないという気はしました。けれども捨てるのはもったいないので、試しにパラパラと眺めてみようと思ったのです。やっぱり不要だと分かれば、その時点で廃棄すればいいだけですし。それに、新しい本ならば、むやみやたらとアンダーラインを引いたり書き込みをするのは躊躇されるけれども、これであれば気兼ねなくそれができます。
 んで、その初版を使ってみての感想ですが、これがなかなかいいんですよ。第1章と第2章で、パターンやアクションの基本的記述方法が詳しく解説されています。特に第2章「AWK言語」の部分は、基本的な事項を詳細に解説しています。正規表現に関しては、第2版よりも分かりやすいような気がします。
 初版第2章「AWK言語」に書かれている内容は、第2版においては主に巻末の「付録 リファレンスマニュアル」で取り上げているようですが、リファレンスの形で解説されるよりも、初心者にとってはまとめて解説された方が分かりやすいと言えます。そういった意味で、初版の方が初学者向きのように感じます。第2版では、AWKの使用実例が増えているようで、経験者向きです。
 ただし、初版の翻訳では、ちょっと独特な訳語が見られます。フィールドのことを「」と言い、メタ文字のことを「超文字」などとしています。フィールドのことを、表計算ソフトのように列と表現したり、カラムと言い換えるのはよく見ますが、「欄」という表現は初めて見ました。
 この初版はもう古くて捨てられようとしていたのですが、それをたまたま見つけ、拾い上げました。偶然に手元に置くことができて、よかったです。何と言っても、最初から気兼ねなくばんばんと赤線を引けるのはいいですね。
 プログラミング言語AWK自体が、ますます好きになりました。実際AWKを使うと、簡単な記述でいろんなテキスト処理ができ、便利です。

 それではまた次の記事で。
  goosyun

リコールで回収のAnkerスピーカーの交換品が届く

 前に書きましたが、私が持っている Anker というメーカーの Bluetooth スピーカーが、リコール対象になりました。「Soundcore3」という商品です。
 なんでも、委託先の製造工程で異物が混入した可能性があって、発火事故の恐れがあるとのことでした。
 昨年11月末に対象製品の回収に応じたのですが、なかなか交換品が送られてきませんでした。
 それが、今日(2026年1月15日)、ヤマト運輸の宅急便で我が家に届きました。1月半ぶりのご対面です。待ってましたのよぉ。

届いた交換品スピーカー ANKER Soundcore3

 さっそく充電して、我が家のノートPCとBluetooth接続しました。そして、音楽を流してみました。
 おぉ、やっぱり音がいいですね。ノートPCの内蔵スピーカーはしょぼいのに対し、このスピーカーを外付け(Bluetoothによる無線接続)すると、けっこう迫力ある音響に変わります。
 すごく小さい製品で、スマートフォンと同じぐらいの長さです。お値段も、わずかに6,990円です。そのように、小さいし、安いスピーカーなのに、かなりの低音が出ます。PCでAmazon MusicYouTubeを楽しむときに、これがあると重宝します。書斎でリラックスしたいときにこれで音楽を聴くと、心が休まります。フュージョンイージーリスニングといった系統が好みで、たまに懐メロポップスです。まぁ、私の聴覚がそれほど高級なものではないのが幸いしているのですが。こういうのは、高品質を求めればキリがないので、価格との釣り合いが大事です。その点、この価格でこの音響、特に重厚な低音域を楽しめるのならば、十分・・・、いえ、十分過ぎるのではないでしょうか。
 この製品には防水機能が付いているので、風呂で使う人もいるようです。そして電池持ちがよくて、いったん充電したら最大24時間の再生が可能っていうのもいいところです。
 リコールによって、1月半ほど、このスピーカーが手元になかったのですが、その間に、このスピーカーのありがたみを再認識しました。今日は、ちょっとしたワクワク感を味わってます。リコールで交換された商品なので、発火事故の心配もないですしね。

 それではまた次の記事で。

    goosyun

AWKとVBAとで異なる比較演算子(「等しくない」の演算子)

 Ubuntu(ウブントゥ) PCに、住所録テキストファイルを保存しています。そして、awk(オーク)コマンド(・・・プログラミング言語AWK)を使って、そのファイルの中から、必要とするデータをいつでも取り出せます。
 住所録には氏名の読み仮名(ひらがら)の入力項目があるから、その氏名読みを使って人の検索をします。具体的には、awkパターンで読み仮名データを照合し、部分一致によって対象の人がピックアップされ、該当のデータ(住所、電話番号、メールアドレス等)を取り出しています。
 そのように、awkのパターン部分が条件分岐の役割を果たすことから、awkにおいて「if文」を書くことって、ほぼないだろうと考えていました。

プログラミングコードぎっしりの画面

 けど、awkでもif文が必要な場合は、やはりあるもんですね。というのは、住所録データにおいては、配偶者フィールドにデータが入っている人と、入っていない人がいるから、配偶者データが登録されているときだけprintアクションが必要となったのです。その場合にはやはり、アクション内にif文を記述することになります。
 第4フィールドに配偶者データがあるとするならば、
  {if($4 != "") print "【配偶者】"$4}
とすればよいわけです。

 ところで、昨夜(2026年1月13日)、そのawkスクリプトを作るに当たって、ちょっとつまづくことがありました。
 「一致しない」「等しくない」を意味する比較演算子として、「!=」と書くべきところを、「<>」と記述してしまったのです。
  {if($4 <> "") print "【配偶者】"$4}
という記述です。
 そうです、これはVBAにおける書き方です。Excel VBA や Word VBA では、等しくないの演算子として「<>」を使います。けれども、「<>」では、awkスクリプトは動作しません。
 昨夜はどう修正すべきかが分からなかったので、仕方なく正規表現を使って、
  {if($4 ~ /.+/) print "【配偶者】"$4}
としました。昨夜は、これで凌ぎました。この書き方でも、動くには動きます。でも、何もこんなところで仰々しく正規表現を使わなくても・・・。
 今朝になって調べてみると、bashawk において、「等しくない」を意味する比較演算子は「!=」だと分かりました。
 このように、プログラミング言語によって細かな違いがあるのは悩ましいところです。所変われば品変わるです。やはり、記憶があいまいな分野では、それぞれの言語の解説・手引書が手放せません。

 それではまた次の記事で。
   goosyun

AWKで文字列を1文字ずつのフィールドに分解する方法

 


1 文字列を1文字ずつに分解する方法

 テキスト処理言語AWK(オーク)の使い方で、私が長いこと抱いていた疑問が、解決されました。ものの見事に解決されたので、まさに「氷解」という表現がピッタリです。
 それぐらい気持ちのよい、スカッとする解決でした。
 この件は先日、一度ブログ記事にしたのですが、私にとってちょっとした感動だったので、改めて、今度はしっかりと自分の言葉で、記事にまとめることにしました。
 疑問点だったのは、区切り文字となるようなものが特にない単なる文字列を、1文字ずつに分解する方法はないものだろうか、というものです。
 AWKを使えば、それができることが分かりました。AWKには、その方法が用意されていたのです。
 んで、文字列を1文字ずつに分解する方法とは・・・、その答えは・・・、
  「空文字("")をフィールドセパレータにする。」です。
 文字列中の文字と文字と間には、空文字("")が存在します。長さ0の文字列です。ですから、その空文字をフィールドセパレータにすればよいのです。そうすれば、1文字ずつのフィールドとなります。これはもう、「なるほど。」って言わずにおれません。これを最初に発見した人というか、このことを思いついた人は、頭のよい人でしょうねぇ。それは、AWK言語の作者らかもしれません。

プログラミング言語AWK(第2版)」 これでバッチリ!

2 オプションの一般的記述方法

 AWKでは、フィールドセパレータの指定のために、-Fオプションが用意されています。
 -Fオプションの引数として指定した値(文字や記号等)がセパレータ(区切り文字)になります。コロン(:)をセパレータにしたいときには、引数にコロンを指定して、-Fオプションに渡します。
 一般的に、オプション名とオプション引数の間は、半角スペースを挿入してもよいし、半角スペースの省略も可能です。
  半角スペースで区切って、「awk -F ":"」 としても、
  オプション名と引数をくっつけて、「awk -F":"」としても、
その両方が許容されています。


3 空文字をオプション引数とする場合の注意点

 一般的には上記2項のとおりなのですが、空文字を-Fオプションの引数とする場合だけは注意が必要です。-Fの直後に、半角スペースの挿入が必ず必要となります。オプション名-Fと、引数の空文字("")をくっつけて、「awk -F""」とすると、シェルによって空文字("")はないものと解釈されてしまいます。そうすると、オプション引数がなくなってしまう、あるいは、半角スペースで区切られた次の文字列がオプション引数と解釈されてしまいます。
 ですから、-Fの後ろに半角スペースを置き、その半角スペースの後ろに来る文字列(この場合、空文字の「""」)がオプション引数であることを、しっかり明示する必要があります。


4 まとめ(記述例)

 -Fオプションを使ったawkコマンドを、実際にいくつか記述してみます。
  (1) $ echo "a:i:u:e:o" | awk -F":" '{print $2,$3}'  #-F直後に半角スペースなし
  (2) $ echo "a:i:u:e:o" | awk -F ":" '{print $2,$3}'  #-F直後に半角スペースあり
  (3) $ echo "aiueo" | awk -F"" '{print $2,$3}'  #-F直後に半角スペースなし
  (4) $ echo "aiueo" | awk -F "" '{print $2,$3}'  #-F直後に半角スペースあり

 上記4例のうち、(1)(2)(4)は正常動作します。実行の結果、期待どおりに「i」と「u」が抽出されます。
 それに対し、(3)は実行されません。(3)の実行がされない理由は、第3項に記載のとおりです。
 この結論を押さえておくだけでも、十分に通用するでしょう。でも今回は、理屈まで理解できました。これで、知識としてしっかり定着させることができたように思います。おそらく、すぐには忘れないでしょうし、もし忘れたとしても、思い出すのは容易のような気がします。


5 おまけ(補足)

 -Fオプションを使用せずに、フィールドセパレータに空文字を指定する方法もあります。それは、次のように記述します。
 $ awk 'BEGIN{FS=""} {print $2,$3}'
 フィールドセパレータのために用意された組み込み変数「FS」に、空文字("")を代入する方法です。「FS=""」と明示した方が、ぱっと見、分かりやすいとは言えます。

 

AWKの定番教科書「プログラミング言語AWK(第2版)

 それではまた次の記事で。
   goosyun

FMラジオ音源をMP3デジタルで録音

 今から10年前の2015年に、SonyのCDラジカセを購入しました。
 当時、仕事の関係で、ある分野の知識を頭に叩き込む必要がありました。その勉強のための教材は、教科書(テキスト)と、膨大な数のカセットテープでした。カセットテープは、講師による講義内容を録音したものです。そのカセットテープの音源を、MP3デジタルデータへ変換するために購入したのが、上記のSonyのCDラジカセだったのです。
 すべてのカセットテープをデジタル化したために、そのラジカセは「もはや用なし」となりました。それ以降、ラジカセは収納したまま、ずっと使っていません。
 SONY製のCDラジオカセット『モリーレコーダー CFD-RS500』という製品です。たしか、2万円ほどじゃなかったかと思います。

 最近、昼の時間帯のラジオ放送NHK FM歌謡スクランブル」という番組がお気に入りです。青春時代に流行していたポップス歌謡が流れるから、オッサンにとっては懐かしさ一杯で、もうたまりません。
 井上陽水ハイファイセット小椋佳・・・などなど(すべて懐メロ)。気に入った曲は、『らじるらじる』でも聴き返しています。
 そうした中、思いつきました。ずっと使わずにしまっておいた、あのCDラジカセが使えるはずだと。そう、ラジオをデジタル化して、録音できるはず・・・、と。んで、クローゼットの奥から探し出し、引っ張り出してきました。
 取扱説明書がどこにやったのか不明だったので、ネットからダウンロードしました。
 んで、操作方法を調べてみると、実に簡単に録音できることが分かりました。
  1 ラジオで聴きたい番組を流す
  2 SDカードを本体の差込口に挿入
  3 「録音」ボタンを押す
  4 録音を止めたいところで「停止」ボタンを押す
 たったの、これだけです。操作としては、「録音」ボタンを押すだけです。何にも煩わしい手順はなくて、これだけで、SDカードに録音されます。また、録音中はランプが赤く点灯するので、録音されていることを目で確認できます。ですから、安心。

ラジオレコーダー

 これは便利です。なんつったって、いったん音源をMP3で取り込めば、後は、PCで聴こうが、居間のシステムコンポの大音量で鳴らそうが、ウォークマンに入れて家の外に持ち歩こうが、自由自在に何でもできます。
 しかも、『らじるらじる』の聴き逃し配信は放送後1週間だけですが、いったんMP3にして手元に置けば、無期限で聴けます。デジタルデータですから、劣化もしませんし。
 2026年1月10日土曜日に放送予定の歌謡スクランブルは、私の好きな高橋真梨子特集です。「桃色吐息」、「はがゆい唇」、「遥かなひとへ」・・・など、懐かしい曲を聴けます。もちろん、MP3に録音予定です。

 なお、Amazonを見てみると、Sonyはこの手の製品をすでに生産停止にしたようで、新品は出ていません。ただ、中古品ならばAmazonに出てます。購入するなら、その中古の在庫があるうち、今のうち、となるでしょう。
 この類の製品は、私には無関係ながら、NHK第2放送の語学講座の録音にも重宝するかもしれません。

SONY ポータブルラジオレコーダー R51 ICZ-R51

 それではまた次の記事で。
   goosyun

もらうと、やはりうれしい年賀状

 今回の私の年賀状ですが、余裕をもって早めに投函できたので、先方には、ほとんどが元日に届いたはずです。
 年々いただく枚数が少なくなっていますが、今年は特に顕著でした。元日に届いたのは、ほんの数枚でした。ただ、元日にいただいた枚数はそのように少なかった一方で、当方の年賀を見て、たくさんの方が返信をくださいました。ですから、1月3日以降に続々と返信の年賀状が届き、合計するとかなりの枚数となりました。
 一般的な傾向として、元日にいただく年賀状よりも、元日を過ぎて、返信としていただく年賀状の方が、丁寧な文面となっています。当方が書いた内容に対して、個別的に返事を書いてくれる方が多くなるからです。これはこれで、うれしいものです。

「もらうとうれしい年賀状」の画像

 私が年賀状を出すとき、ちょっとだけ工夫していることがあります。受け取り側が少しでも負担にならないように、当方のメールアドレスを付記しておくのです。そうしておくと、メール送信での返事が可能となります。
 毎年、メール送信で、1,2名の方が返信をくださいます。
 今年もある方が、とても丁寧な返信文を書いてメール送信してくれました。これはこれで、また、うれしいものです。
 私は、年賀状仕舞いというのはするつもりはありません。年に一度ぐらいは、文面でのやり取りを続けたいと思っています。いろんな価値観があるので、年賀状仕舞いも、否定はしませんけれども。

 それではまた次の記事で。
   goosyun

AWKで文字列を1文字ずつのフィールドに分解

 

 

 テキスト処理コマンド(ツール)のAWK(オーク)を勉強して、これまで疑問に思っていたことが解決しました。これで、少し賢くなりました。

デスクトップパソコン

1 文字列を1文字ずつに分解

 学んだことは、AWKフィールドセパレータ(フィールド区切り文字)についてです。
 文字列の1文字ずつを区切って、それぞれをフィールドにできないだろうかというのが、これまでずっと抱いていた疑問です。私はその方法があることを知りませんでした。これが、あるんですねぇ。できるんですよ!
 答えは、「カラ文字("")をフィールドセパレータにすればよい。」です。なるほど、ってなりました。方法があることが分かったので、うれしくなりました。
 ところが、ここでつまづきました。実地にやってみると、できない、実行がされないのです。
 あれこれともがき苦しんだ末に、生成AIのGeminiに相談しました。そうすると、実に明快な回答をしてくれました。そのすばらしい解説ぶり、理解しやすい説明に感心してしまいました。
 そこで、私の質問と、Geminiの解説を、ここにそっくりそのまま掲載して、皆様にご紹介します。

2【Geminiへの質問】

AWKでフィールドセパレータを指定する-Fオプションの記述方法が、よく分かりません。
 (1)  $ echo "a:i:u:e:o" | awk -F":" '{print $2,$3}'
 (2) $ echo "a:i:u:e:o" | awk -F ":" '{print $2,$3}'
上記(1)(2)どちらの記述でも実行できます。
つまり、Fの後ろの半角スペースの有無は影響しません。
ところが、
 (3)  $ echo "aiueo" | awk -F"" '{print $2,$3}'
 (4) $ echo "aiueo" | awk -F "" '{print $2,$3}'
となると、Fの後ろの半角スペースの有無で結果が異なります。
(3)では実行されないのに対し、(4)では想定どおりの実行がされます。
つまり、Fの後ろの半角スペースが必要とされます。
これは、どういう理由からでしょうか。

 

3【Geminiの回答】

 非常に鋭い着眼点ですね。 結論から申し上げますと、これはAWK自体の挙動というよりは、「シェル(Bashなど)がコマンドに引数を渡す際のルール」と「AWKが引数を解釈する順番」のミスマッチが原因です。
 一言で言うと、(3)のケースでは「プログラムそのもの('{print ...}')が区切り文字として誤って解釈されてしまっている」ために実行されません。
 なぜそうなるのか、シェルの裏側の動きを図解的に解説します。

原因のメカニズム
 シェルがコマンドを実行する際、""(空のクォート)は「空文字」を意味しますが、シェルはこれを解釈した後、クォート自体を取り除いてコマンドに渡します。
【1】 成功するケース (4) -F "" の動き
 コマンド: awk -F "" '{print $2,$3}'
 この時、シェルは以下の 3つのパーツ に分けてAWKに渡します。
 1 awk (コマンド)
 2 -F (オプション)
 3 (空文字:""の中身)
 4 '{print $2,$3}' (プログラム)
 AWKはこれを受け取り、以下のように解釈します。
・ 「お、-Fが来たな。次の引数を区切り文字にしよう」
・ → 次の引数は「空文字」だ。OK、区切り文字は「なし(1文字ずつ)」に設定する。
・ → その次の引数がプログラムだな。実行しよう。
・ 結果:成功

【2】 失敗するケース (3) -F"" の動き
 コマンド: awk -F"" '{print $2,$3}'
 ここで問題が起きます。シェルは -F"" を見ると、"" は「中身がない」ので消滅させ、前の文字と結合します。その結果、AWKに渡されるのは以下の 2つのパーツ だけになります。
 1 awk (コマンド)
 2 -F (オプション。「""」が消えて単なる -F だけが残る)
 3 '{print $2,$3}' (プログラム)
 AWKはこれを受け取り、以下のように解釈します。
・ 「お、-Fが来たな。次の引数を区切り文字に設定しなきゃ」
・ → (-Fの後ろに文字がくっついていないので、次のパーツを見に行きます)
・ → 「次の引数は '{print $2,$3}' だな。よし、これを区切り文字にしよう!」
・ → 「さて、プログラムを実行するか……あれ? もう引数がないぞ? プログラムはどこだ?」
・ 結果:エラー(または予期せぬ動作)
 つまり、(3)では実行したいプログラムのコードが、区切り文字の設定として吸い込まれてしまっているのです。

補足:なぜ (1) -F":" は動くのか?
 (1) の $ awk -F":" の場合、シェルはクォートを外して -F: というひとかたまりの文字列をAWKに渡します。
 AWKのオプション解析ルールでは、「オプション文字(F)の直後に文字がある場合、それを値として採用する」という決まりがあります。 そのため、: が即座に区切り文字として認識され、後ろのプログラム部分には影響が出ないため、正常に動作します。

まとめ
・ -F の後ろに文字がある場合(例: -F:)
   その文字が区切り文字になり、正常動作します。
・ -F の後ろが空文字の場合(例: -F"")
   シェルが "" を消してしまうため、AWKは「-F だけ」を受け取ります。
   AWKは「値が足りない」と判断し、次の引数(プログラム部分)を区切り文字として奪ってしまいます。
・ スペースを入れた場合(例: -F "")
   「-F」と「空文字」が別々の引数として渡されるため、正しく空文字が区切り文字として認識されます。

別の書き方(推奨)
 もし「空文字指定(1文字ずつ分割)」を、スペースの有無を気にせず安全に書きたい場合は、-v オプションを使って変数 FS (Field Separator) を直接指定する方法もおすすめです。
   echo "aiueo" | awk -v FS="" '{print $2, $3}'
 これなら、-F のスペース問題に悩まされることはありません。

 

それではまた次の記事で

    goosyun