• ベストアンサー

UNIXで文字列分割

UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.7

>aaaa bbbb cccc dddd bbbb eeee tttt bbbb yyyy >  ↓「bbbb」で分割して$2と$4をファイルに出力 >cccc dddd,yyyy なんでやりたいことを最初から書かないのかわかりませんが、 awk '{split($0,A,/bbbb/);print A[2]","A[4]}' 前後の空白を除きたいなら、 awk '{split($0,A,/ *bbbb */);print A[2]","A[4]}'

その他の回答 (6)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

#5を一部訂正します。 awk 'BEGIN{ FS="bbbb"; OFS="\n"} ($1=$1)||1' わかりやすくすると awk 'BEGIN{ FS="bbbb"; OFS="\n"} {$1=$1; print}'

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

レコードセパレータに2バイト以上の長さの文字列を指定できないawkはありますが、 フィールドセパレータで使えないawkというのは聞いたことがありません。 Solarisのawkは腐っていることで悪名高いですがそれでもこの程度のことはできます。 awk 'BEGIN{ FS="bbbb"; OFS="\n"} 1'

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.4

別のファイルに分けるのでなく、行を分割するということですか? それなら#3の方がお書きのsedが楽ですね。 sed 's/bbbb/\ /g' inputfile > outputfile g が1行の中で複数回置き換えるという意味です。 あと、UNIXでというのを見落としていました。確かにUNIXだとawkの機能はOSによって違います。Linuxだとまず間違いなく同じ(gnu-awk)なのですが。

sjump2m
質問者

お礼

回答ありがとうございます。 sed 's/bbbb/\/g' inputfile > outputfile bbbb→\で置換するということですよね。 質問するときに、書いておけばよかったんですが、 やりたいことはセパレータで分割して、分割したフィールドから 任意のフィールドをファイルに出力したいです。 例) aaaa bbbb cccc dddd bbbb eeee tttt bbbb yyyy   ↓「bbbb」で分割して$2と$4をファイルに出力 cccc dddd,yyyy といった感じにしたいです。 よろしくお願いします。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

Ano.2のように-Fで複数文字を指定するのはできる場合とできない場合があります。awkにもいろいろバージョンがあるので。 sed 's/bbb/\ /' でもできますが。・・ なぜawkで処理をしたいのでしょうか? それとひとつの行の中に区切りが2回以上出てくることはありますか?

sjump2m
質問者

お礼

回答ありがとうございます。 sedでも文字列分割できるんですね。 awkでなくても問題はありません。 ほかの処理がawkを使っていたので・・・ それと、区切りですが、1行に2回以上あります。

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.2

たぶん、「マルチバイト」という言葉を間違って使っているんじゃないかな。 マルチバイトというのは#1の方がそうとられたように、「日本語などのように1文字を複数バイトであらわす文字コード体系やその文字」を指します。 もしかして、awk のフィールドセパレータを1文字じゃなく文字列を使いたいということではないかと思います。 セパレータが複数文字の時は、それを正規表現と見なしてそれにマッチするものをセパレータとして扱います。bbbb が記号などを含まない英数字なら、単に、 awk -Fbbbb '{print $1 >"file1";print $2 >"file2"}' inputfile でいいはずです。

sjump2m
質問者

お礼

回答ありがとうございます 教えていただいた方法で実行してみたところ、期待した動作になりませんでした。 対象文字列:aaaa bbbb cccc dddd eeee ffff 実行処理:awk -Fbbbb '{print $1 >"file1";print $2 >"file2"}' inputfile 結果 [1]aaaa [2]bbb cccc dddd eeee ffff となってしまいます。 どうも、セパレータの1バイト目で分割してしまうようです。 これは、Solarisのawkだからなのでしょうか?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

実際に使っているOSを明確にしてください。 UNIX の variant でも最近のものであれば商用のもの、無償配布のものを 問わず基本的なところでのマルチバイト文字対応はできています。 awkについてもしかり。

sjump2m
質問者

お礼

回答ありがとうございます。 No2の方の言うようにマルチバイトの意味を間違えていました。 複数文字列をセパレータとしたいという意味です。 ちなみにOSはSolaris9です。

関連するQ&A

専門家に質問してみよう