- ベストアンサー
UNIXで文字列分割
UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。
- みんなの回答 (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)
#5を一部訂正します。 awk 'BEGIN{ FS="bbbb"; OFS="\n"} ($1=$1)||1' わかりやすくすると awk 'BEGIN{ FS="bbbb"; OFS="\n"} {$1=$1; print}'
- sakusaker7
- ベストアンサー率62% (800/1280)
レコードセパレータに2バイト以上の長さの文字列を指定できないawkはありますが、 フィールドセパレータで使えないawkというのは聞いたことがありません。 Solarisのawkは腐っていることで悪名高いですがそれでもこの程度のことはできます。 awk 'BEGIN{ FS="bbbb"; OFS="\n"} 1'
- notnot
- ベストアンサー率47% (4900/10359)
別のファイルに分けるのでなく、行を分割するということですか? それなら#3の方がお書きのsedが楽ですね。 sed 's/bbbb/\ /g' inputfile > outputfile g が1行の中で複数回置き換えるという意味です。 あと、UNIXでというのを見落としていました。確かにUNIXだとawkの機能はOSによって違います。Linuxだとまず間違いなく同じ(gnu-awk)なのですが。
- a-saitoh
- ベストアンサー率30% (524/1722)
Ano.2のように-Fで複数文字を指定するのはできる場合とできない場合があります。awkにもいろいろバージョンがあるので。 sed 's/bbb/\ /' でもできますが。・・ なぜawkで処理をしたいのでしょうか? それとひとつの行の中に区切りが2回以上出てくることはありますか?
お礼
回答ありがとうございます。 sedでも文字列分割できるんですね。 awkでなくても問題はありません。 ほかの処理がawkを使っていたので・・・ それと、区切りですが、1行に2回以上あります。
- notnot
- ベストアンサー率47% (4900/10359)
たぶん、「マルチバイト」という言葉を間違って使っているんじゃないかな。 マルチバイトというのは#1の方がそうとられたように、「日本語などのように1文字を複数バイトであらわす文字コード体系やその文字」を指します。 もしかして、awk のフィールドセパレータを1文字じゃなく文字列を使いたいということではないかと思います。 セパレータが複数文字の時は、それを正規表現と見なしてそれにマッチするものをセパレータとして扱います。bbbb が記号などを含まない英数字なら、単に、 awk -Fbbbb '{print $1 >"file1";print $2 >"file2"}' inputfile でいいはずです。
お礼
回答ありがとうございます 教えていただいた方法で実行してみたところ、期待した動作になりませんでした。 対象文字列: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)
実際に使っているOSを明確にしてください。 UNIX の variant でも最近のものであれば商用のもの、無償配布のものを 問わず基本的なところでのマルチバイト文字対応はできています。 awkについてもしかり。
お礼
回答ありがとうございます。 No2の方の言うようにマルチバイトの意味を間違えていました。 複数文字列をセパレータとしたいという意味です。 ちなみにOSはSolaris9です。
お礼
回答ありがとうございます。 sed 's/bbbb/\/g' inputfile > outputfile bbbb→\で置換するということですよね。 質問するときに、書いておけばよかったんですが、 やりたいことはセパレータで分割して、分割したフィールドから 任意のフィールドをファイルに出力したいです。 例) aaaa bbbb cccc dddd bbbb eeee tttt bbbb yyyy ↓「bbbb」で分割して$2と$4をファイルに出力 cccc dddd,yyyy といった感じにしたいです。 よろしくお願いします。