- ベストアンサー
GOWでcsplitコマンドを使いたい
- プログラミングも正規表現も判りませんが、ファイルを任意の文字列で分割したく、色々方法を探して csplitコマンドしかないようだと、Gowをインストールしました。
- ABCDEF,2013-01-01,00:00:00,... という形式のデータを奇数月の1日何時で分割、ファイル名を ABCDEF_2013-01.txt のようにしたいのですが (03|05|07|09|11)のように(AA|BB|CC)と並べるとなぜか 'BB'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 というエラーが出てしまいます。 (A\w{5}|B\w{5}|C\w{5})のようだと出ないのですが。 ファイル名が違うのが大量にあるので 出来ればフォルダ指定で一括処理したいと思っているのですが。
- csplitコマンドのオプションや正規表現の書き方について詳しく知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
テスト用ファイルを作成して、確認してみました。 どうやら、GOWのcsplitでは、POSIX正規表現よりも、さらに使える表現が少ないようです。 \{\}による数の指定はできないようです。 そのかわり、{*}は期待通りに動いているようです。 なお、Cygwin用のcsplitでは /^.\{15\}01,00:00/で動作しました。 GOWのものが csplit (GNU coreutils) 5.3.0 cygwinのものが csplit (GNU coreutils) 8.15 なので、バージョンの違いかもしれません。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
もう一度、#1にある正規表現の説明を読んでください。 正規表現は、そのツール毎に違います。テキストエディタで使える表現が、csplitで使える表現と一致するとは限りません。 手許にGOWも分割元ファイルもないので確認できないのですが csplit -f ABCDEF_ -z ABCDEF2013.txt /^.\{15\}01,00:00/ {*} だと動作したりしませんか?
お礼
再びの回答、ありがとうございますm(_ _)m 最後の * を数字にしたパターン / / の外側を更に " や ' で括ったのの * と数字と試してみましたが {*}では元サイズ一つ {8}では作成しかけるもののラスト削除で match not found 表示 これまでと同様の結果でした>< >正規表現は、そのツール毎に違います。 その上cmdのルールを考慮するのは素人にはハードル高いですね><
- kmee
- ベストアンサー率55% (1857/3366)
http://www.fan.gr.jp/~ring/doc/coreutils/coreutils-ja_5.html#SEC24 まずは、マニュアルの熟読を。 > (03|05|07|09|11)のように(AA|BB|CC)と並べるとなぜか > > 'BB'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 > > というエラーが出てしまいます。 入力されたコマンドラインは、まず、cmdが解釈します。 |はパイプラインです。 csplit ~ (AA|BB|CC) ~ と書けば csplit ~ (AA の標準出力を BBコマンドの標準入力に。その出力を CC) ~ コマンドの標準入力に と解釈されます。その結果が「BBというコマンドはない」というエラーです。 「空白とか特殊文字とかを含む引数を使いたいときは、""でくくる」といった、コマンドプロンプトの基本ルールが守れていないのが原因です。 > -f $1_$2 のようにはできないのでしょうか? 上記エラーは、これとは関係ありません。 ただし。別の問題があります。 この$1,$2,$3は何のつもりですか? 後部の正規表現の()を引用するつもりなら「そのような使い方はできません」 -fで指定するのは、出力ファイルにつくファイル名の先頭部分の「文字列」です。 -nは通し番号の桁数です。 どちらも固定のものです。 構文 http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#.E4.BC.9D.E7.B5.B1.E7.9A.84.E3.81.AA_UNIX_.E3.81.AE.E6.AD.A3.E8.A6.8F.E8.A1.A8.E7.8F.BE cscpitの正規表現は、POSIX標準のものだったと思います。少なくとも\dは数字ではありません。
お礼
回答ありがとうございます ファイル名に流用できないなら分割列だけ検索しようと思いましたが 奇数月の指定の仕方が判らず、取り敢えずあるだけ同じ日時で切ろうと思いました csplit -f ABCDEF_ -z ABCDEF2013.txt /^.{15}01,00:00/ {*} だと元ファイルと同サイズのファイルが一つできます どこかで{*}は使えないというケースも見たので csplit -f ABCDEF_ -z ABCDEF2013.txt /^.{15}01\,06:00/ {8} csplit -f ABCDEF_ -z ABCDEF2013.txt /^.{15}"01,06:00".+$/ {8} などとやると csplit: `/~/': match not found と出てしまいます まだどれかのルール違反をしているのでしょうか?? テキストエディタの正規表現検索では、"" を使わなければ合っているのですが><
お礼
わざわざありがとうございます! . { } がダメなんて、自力では絶対判りませんでした .\{\}が要らない形に変えたらGowでも動きました。 取り敢えずエクセルでコマンド文の 元ファイル名と出力ファイル名(-f指定)を全部違うのに加工して実行したら 実行時のルートディレクトリに全てのファイルが作成されました これたけでも単純作業での凡ミスが大幅に減らせると思います 助かりました! 感謝です!