web-dev-qa-db-ja.com

ファイルをn個の部分に分割する方法

一部の行が続くファイルがあります。特定の名前のn個のファイルにファイルを分割したい。各ファイルに何行あるかは関係ありません。特定のno.ofファイルが欲しいだけです(たとえば5)。ここでの問題は、元のファイルの行数が変化し続けることです。したがって、行数を計算せずに、ファイルを5つの部分に分割する必要があります。可能であれば、それぞれを異なるディレクトリに送信する必要があります。

29
new person

Bashでは、splitコマンドを使用して、必要な行数に基づいて分割できます。 wcコマンドを使用して、必要な行数を把握できます。 wcsplitと組み合わせて1行にしています。

たとえば、onepiece.logを5つの部分に分割するには

    split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4

これにより、onepiece.split.log0000などのファイルが作成されます...

:bashの除算は切り捨てられるため、余りがある場合は6番目のパーツファイルが存在します。

39
sketchytechky

あなたがテキストファイルを処理していると仮定すると、wc -lは行の総数を決定し、split -l指定した行数に分割します(合計/ 5行)。これは、UNIX/MacおよびWindowsで動作します( cygwin がインストールされている場合)

6
bjg

Linuxには split コマンドがあり、

split --lines=1m /path/to/large/file /path/to/output/file/prefix

固定サイズのINPUTをPREFIXaa、PREFIXab、...に出力します。デフォルトのサイズは1000行で、デフォルトのPREFIXは「x」です。 INPUTがない場合、またはINPUTが-の場合は、標準入力を読み取ります。

...

-l、--lines = NUM​​BERは、出力ファイルごとにNUMBER行を配置します

...

ただし、事前に分割の実際のサイズを計算する必要があります。

6
miku

これは、@ sketchytechkyと@Grasshopperによる元の回答に基づいています。残りの部分を別の方法で処理し、出力として固定数のファイルが必要であるが、行のラウンドロビン分散が必要な場合、splitコマンドは次のように記述します。

split -da 4 -n r/1024 filename filename_split --additional-suffix=".log"。 1024を、出力として必要なファイルの数に置き換えます。

2
Vishnu

いくつかの方法を考えることができます。どちらを使用するかは、データに大きく依存します。

  1. 行は固定長です:ファイルのディレクトリエントリを読み取ってファイルのサイズを見つけ、行の長さで除算して行数を取得します。これを使用して、ファイルあたりの行数を決定します。

  2. ファイルは、ほぼ同じ行数である必要があります。再度、ディレクトリエントリからファイルサイズを読み取ります。最初のN行を読み取って(Nは小さいはずですが、ファイルの妥当な割合です)、平均行長を計算します。ファイルサイズと予測される平均行長に基づいて、おおよその行数を計算します。これは、線の長さが正規分布に従うことを前提としています。そうでない場合は、ランダムに行をサンプリングするようにメソッドを調整してください(seek()または類似のものを使用)。平均が得られたらファイルを巻き戻し、予測された行の長さに基づいて分割します。

  3. ファイルを2回読み取ります。初回は行数を数えます。 2回目は、ファイルを必要な部分に分割します。

[〜#〜] edit [〜#〜]:シェルスクリプトを使用して(コメントに従って)、ランダムなバージョンの#2は、それを行う小さなプログラムを作成しない限り困難です。 。 ls -lを使用してファイルサイズを取得し、wc -lを使用して正確な行数をカウントし、head -nNNN | wc -cを使用して平均行長を計算できるはずです。

0
tvanfosson