web-dev-qa-db-ja.com

大きなファイルを分割するには?

次のようなlist.txtのすべてのファイルを渡すにはどうすればよいですか

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

splitコマンド(dirには他のtxtファイルがあります)に追加し、次のように番号付けされた部分を返します(file1_1.txtは4つの部分に分割されると仮定します)

file1_1_1.txt;
file1_1_2.txt;
file1_1_3.txt;
file1_1_4.txt 

等々....

5
user3069326

改行がないことを確認するには、c以外のオプションを使用できます。

split -n #number

#numberチャンクでファイルを分割することで、それらが等しくなり、行が途切れないようにすることができます。

split -n 4 file.txt

これにより、file.txtが4つのチャンクに分割されます。

または、行数で分割できます

split -l #number-of-lines

split -l 200 file.txt

これにより、file.txtはそれぞれ200行のファイルに分割されます。ただし、最後のファイルが選択した数よりも少ない可能性があるため、すべてが同じ長さであるため、これは正確ではありません。

ネーミングに関して。コマンドsplitのデフォルトでは、デフォルトのサフィックス「x」とデフォルトのプレフィックス「aa」「ab」「ac」が使用されます...

したがって、これらのデフォルトを変更するには、使用するサフィックスを指定する必要があります。

あなたの場合に使用できます

split -n #number file1_1.txt file1_1.

出力はfile1_1.aa file1_1.ab file1_1.acのようになります

それ以外の場合は、-dを使用してデフォルトのプレフィックスを番号に変更できます

  split -n #number -d file1_1.txt file1_1.

出力はfile1_1.00 file1_1.01 file1_1.02のようになります

したがって、REGEXでawkまたはsedを使用しない限り、デフォルトの分割では目的の名前を取得できません。

ファイルからファイルのセットを読み取るには、files.listという名前を付けます

while IFS= read -r file

do split -n #number -d "$file" "$file"

done < files.list

UPDATE:私はこれに来ました https://unix.stackexchange.com/questions/32626/split-a-file-by-行と結果のファイルの拡張子の制御

2番目の答えによると

gnu splitの最近のバージョン(≥8.16)では、-additional-suffixスイッチを使用して、結果の拡張機能を制御できます。男スプリットから:

--additional-suffix = SUFFIXは、ファイル名に追加のSUFFIXを追加します。そのため、そのオプションを使用する場合:

split -dl 10000 --additional-suffix = .txt word wrd結果の断片は自動的に.txtで終わります:

wrd00.txt wrd01.txt

あなたの場合、あなたの分割バージョンが8.16以上であれば、このようにあなたはあなたのニーズを行うことができます

split -n #number -d --additional-suffix=.txt file1_1.txt file1_1-

出力は次のようになります

file1_1-00.txt file1_1-01.txt file1_1-02.txt .....
6
Maythux
while read file; do split <some options> "$file"; done < list.txt

ファイル名に空白またはバックスラッシュを含めることができる場合は、代わりにこれを使用します。

while IFS= read -r file; do split <some options> "$file"; done < list.txt
2
Cyrus

これが私の粗雑なワンライナーです。

awk -F '。' '{$ 3 = $ 1; print $ 1 "。" $ 2 "" $ 3 "_"}' list.txt | xargs -n2 split --numeric-suffixes = 1 -n 4 --suffix-length = 1 --additional-suffix = "。txt"

説明

ファイルには次のエントリが含まれます。

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

それらをawkで取得し、区切り文字としてドットを使用して、2列のリストを作成します

file1_1.txt file1_1_
file1_2.txt file1_2_
file1_3.txt file1_3_
file1_4.txt file1_4_

次に、xargsはその出力(実行ごとに2つのエントリ(-n2))を取得し、1から始まる数値サフィックスを使用してsplitを実行し、4つのファイルに分割し、最後に「.txt」を追加します。そして、ここにそのonelinerのデモがあります:

enter image description here

1