• ベストアンサー

awkでバイト数を方法

文字列$2を300文字まで切り取る方法は substr($2,1,300)ですが、 全角半角が混在している文字列を 先頭から300バイト取得する方法が分かりません。 お手数をおかけしますが、 ご教授願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#194317
noname#194317
回答No.2

あっさりシングルバイト版のawk を使うか、全角文字を考慮しないよう指定できる オプションを持つawk(参考URL)を使うのが一番簡単じゃないですか? ただひとつ心配なのは、300バイト目に全角文字が来た場合です。この時、問答無用で 取り出すと、300バイト目は全角文字が分断されてしまったゴミとなりますが、 これは問題ありませんか? 問題なければ、単純にsubstrで300バイト分取り出せば済みます。それだと困る…と いうことなら、効率は悪いですがループを組んで一文字ずつ取り出し、 hankaku=sub(/[ -~]/,"1",$2から一文字取り出したもの) とかやって今取り出した文字を置換してみて、変数hankakuがゼロじゃなければその 文字は半角です。こうやって一文字ずつ取り出しては全角かどうか調べ、長さを調整して 連結していくことになります。

参考URL:
http://www.vector.co.jp/soft/dl/win95/util/se015007.html

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ちょっと情報が古いかもしれませんが、 jgawkというのがあって gawkを日本語対応させたものですが、 それには、 jsubstr($2,1,300) で全角半角が混在する文字列から300文字切り出せます。 (300文字ではなく、300バイトの場合は、そのままでいいと思います)

関連するQ&A

  • Excelで22バイトの文字を数えたい

    Excel2002です。 VBAでセルの文字列を取得する時に全角制御文字(2バイト)を含めて22バイトの制限を考慮したいのですがその方法がわかりません。 全角文字だけなら10文字、  半角文字だけなら22文字の取得ができます。 その後の作業の都合上、22バイトを基準に条件判断したいのですが現在はその方法がわからないためLEN()で10を上限としています。LENB()でも同じ結果(文字数が返される)になります。 対象のセルには全角文字/半角文字が混在しており、全角-半角-全角-半角のような混在であれば制御文字を2回考慮する必要があります。 最悪その文字が全角か半角かの区別がつけば対応できると思います。 よい方法をご教授いただきたくお願いいたします。

  • 全角半角あわせて3文字

    全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか? mb_substr関数で第3パラメータはバイト数で指定するようです。 関数リファレンスでは「最大文字数」って表現になってます。 http://php.net/manual/ja/function.mb-substr.php 半角なら文字数=バイト数ですが、全角だと指定の半分の文字数になります。 最大だから間違ってはないですが、文字数じゃないよな‥‥っていつも思ってます。 いったん半角→全角にして、6バイト分を切り出すのはできます。 でも、英数字も全角半角混在してるので元の文字列を壊したくないのです。 mb_substrの第3パラメータを6から3まで、mb_strlenが3になるまで回すのもやってみました。 でも、なんかスマートじゃないんですよ‥‥。 なにかこう、スマートないい手はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 全角半角混在の文字列から○文字まで取得する方法

    はじめまして! MySQLから取得した文字列をPHPで例えば10文字まで表示したいのですが、良いやり方ありますでしょうか? 文字列には全角半角が混在しているので substr関数だと、うまく取得できない場合があります。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Excelでバイト数の最大数が決まったデータを作りたいんです!

    上手く説明出来ないんですが・・。 エクセルで、項目それぞれにバイト数の最大数が決まったデータを作りたいんです。 例えば ◆職員番号・・・バイト数12(半角)         職員番号は8桁なので、その後ろに残り12バイトまでの半角パディング。 ◆氏名 ・・・ バイト数16(全角8字まで)         全角8文字以内なら、その後ろに残り8文字までの全角パディング。         全角8文字を超す氏名なら、8文字で切る。 ◆カナ ・・・ バイト数58(半角)         半角カナ文字で残りの58バイトまで半角パディング。 *これをcsvに変換します! これを文字列だけ打ち込んだら、自動で最大バイト数まで半角・全角を埋めるようにすることは出来るでしょうか? また、氏名のところのように自動で8文字までの入力しか出来なくするようにすることは出来るでしょうか? 説明が下手で申し訳ないんですが、おわかりになる方ご教授下さい。 よろしくお願いします!!

  • 全角、半角、改行コードが混在文を指定文字数でカットしたい。

    こんにちは。 現在、phpで簡単な動的ページを作成しています。 行き詰っていますのは、文字列抽出?です。 ある文字列を先頭文字から300文字だけ切り出して以降はカットしてしまいたいのです。 但しその文字列が全角、半角、改行コード(EUC)が混在していまして、うまく切り出せません。 混在文字列からも文字列指定で切り出す関数や手段をご存知の方はいらっしゃいませんか? お手数では御座いますが、お教え下さい。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • substrでutf8の日本語文字を先頭から10文字取り出す

    現在utf8で掲示板を作成しています。 エントリーの先頭10文字程度を取り出したいのですが、 substrではうまくいきません。 どなたか経験のある方教えてください。 $word="あいaaうえbお\nかきa1aくけこ\abcdeft"; という半角と全角が混在したデータがあり、 半角全角にかかわらず先頭から10文字を取り出したいのですが、 substr($word,0,10);とやっても、 日本語が含まれているためうまくいきません。 shiftjisへ変換してから処理する方法は見つけたのですが、 データが多くオーバーヘッドがかかるので、 utf8のままハンドリングしたいと思っています。 どなたか経験のあるかた教えてください。

    • ベストアンサー
    • Perl
  • Ruby1.9で文字列中の全角文字数を調べたい。

    Ruby1.9を使っております。 次のような全角、半角が混在した文字列があり、その文字列の中から、 全角の文字数、半角の文字数がそれぞれ何文字あるか調べる方法はありますでしょうか。 ■文字列例 "あいイウう" どうか良きアドバイスをお願いいたします。

    • ベストアンサー
    • Ruby
  • soraris10 ksh で文字列をバイト指定し

    soraris10 ksh で文字列をバイト指定して入れ替える 8バイトの文字列の4バイト目と7バイト目を入れ替えたい場合、簡単にできる方法はありますか? 文字列は半角英字のみです。 echo abcdefgh | awk ’{print substr(ゴニョゴニョ) substr(ゴニョゴニョ)}’ で頑張ってやりましたが、美しくなかったので、sedとかでもっと簡単にできないでしょうか。 宜しくお願いいたします。

  • バイト数

    こんにちわ。 VB6でのすごく初歩的な質問なんですが、テキストボックスの中の文字のバイト数をLenB関数で取得して表示させようとしたのですが、半角も全角も1文字2バイトとでてしまいますがなぜでしょうか? お暇なときで結構ですのでどなたか回答をおねがいします。

  • 文字列取得 substrではできません。

    1バイト2バイト混在文字列を substrで取得すると、2バイト文字が半分になるため最終文字が文字化けします。 1、2バイト混在文字をうまく取得できる関数はありますか?

    • ベストアンサー
    • PHP

専門家に質問してみよう