web-dev-qa-db-ja.com

csplitの{99}制限を超えて、テキストファイルを複数のファイルに分割します

.txtファイルの内容を複数のファイルに分割したいのですが、csplitの制限について2つの質問があります。

(1)csplitの「99」ファイル分割の最大制限を回避する方法を誰かが提供できますか?繰り返し発生する空白行または文字に基づいて、最大384個の分割を含むファイルがあります。 csplitでこれを{*}で処理できるようにしたいのですが、これはcsplitの固有のファイル生成容量を超えています。

(2)ファイルの内容をcsplitに渡す方法(パイプからcsplit)を知っている人はいますか、またはcsplitはファイルを所定の場所で呼び出す従来の方法でのみ使用できますか?つまり、csplit -f split_name file_to_split.txt /split/ {*}[series of commands] | csplit -f split_name /split/ {*}

同様のタスクを実行するための提案または代替案をありがとうございます。

2
kehmsen

Michael Homerが述べているように 、POSIX準拠のcsplitは99を超えるファイルを取得できますが、-nオプションを渡す必要があります。

csplit -n 3 file_to_split.txt

そうは言っても、csplitのGNUバージョンでは簡単に実行できるが、FreeBSD/OSXバージョンでは実行できないタスクがある場合は、GNUバージョン(の一部)をインストールできます。 GNU coreutils)。 GNU coreutilsはいくつかのソースからインストールできますが、最も人気があるのは homebrew だと思います。 Mac OSXユーティリティをGNUコアユーティリティに置き換える方法は? も参照してください。

あるいは、csplitが行うことのほとんどは、数行のawkで実装できます。これにより、出力ファイル名などの点で柔軟性が高まります。次のスニペットは、標準入力から読み取り、行をpart-000.txtpart-001.txtなどに書き込み、行にheader-lineが含まれるたびにファイルを変更します。

awk '
    /header-line/ {
        ++part;
        if (output_file) close(output_file);
        output_file=snprintf("part-%03d.txt", part)
    }
    {print >file}
'