1. ホーム
  2. bash

[解決済み] ファイルを分割する方法。重複

2022-10-09 20:18:19

質問

ファイルを等分に分割することが可能かどうか、疑問に思っていました( を編集します。 = 最後を除いてすべて等しい)、行を分割することなくできますか?Unixのsplitコマンドを使用すると、行を半分に分割することができます。例えば、1つのファイルを5等分して、それでも全行で構成されるようにする方法はありますか(1つのファイルが多少大きくても小さくても問題ありません)?行数を計算すればいいのは分かっているのですが、bashスクリプトで多くのファイルについてこれをしなければなりません。多くの感謝!

どのように解決するのですか?

もし、同じ数の 行です。 split には、このためのオプションがあります。

split --lines=75

もし、その 75 が本当にそうであるべきなのか N を等分にする必要があります。

lines_per_part = int(total_lines + N - 1) / N

ここで、総行数は wc -l .

例として以下のスクリプトをご覧ください。

#!/usr/bin/bash

# Configuration stuff

fspec=qq.c
num_files=6

# Work out lines per file.

total_lines=$(wc -l <${fspec})
((lines_per_file = (total_lines + num_files - 1) / num_files))

# Split the actual file, maintaining lines.

split --lines=${lines_per_file} ${fspec} xyzzy.

# Debug information

echo "Total lines     = ${total_lines}"
echo "Lines  per file = ${lines_per_file}"    
wc -l xyzzy.*

これは出力されます。

Total lines     = 70
Lines  per file = 12
  12 xyzzy.aa
  12 xyzzy.ab
  12 xyzzy.ac
  12 xyzzy.ad
  12 xyzzy.ae
  10 xyzzy.af
  70 total


より新しいバージョンの split の数を指定することができるようになりました。 CHUNKS と共に -n/--number というオプションがあります。したがって、次のような使い方ができます。

split --number=l/6 ${fspec} xyzzy.

(それは ell-slash-six という意味で lines ではなく one-slash-six ).

これで、サイズ的にほぼ同じファイルができ、中途半端な行の分割もなくなります。

最後のポイントについて言及するのは、これでは、ほぼ同じ数の が同じ数になるわけではなく、もっと同じ数の 文字です。

つまり、20文字1行と1文字19行(合計20行)で、5つのファイルに分割した場合、最も可能性が高いのは にはならないでしょう。 ということになります。