ディレクトリ内の文字数でテキストファイルを分割する方法

ディレクトリ内の文字数でテキストファイルを分割する方法

ディレクトリ内の複数のテキストファイルを、指定された文字数よりも小さいテキストファイルに分割したいと思います。たとえば、ディレクトリ内のすべてのファイルをそれぞれ100文字の小さなテキストファイルに分割したいとします。私が理解したように、Linuxの分割コマンドは文字数ではなく行数だけで動作するため、これが機能するかどうかはわかりません。

編集:テキストファイルを単語数に分割する方法も知りたいです。

答え1

ファイルがASCIIテキストの場合に使用できますsplit -b100。これは100バイト、常に100文字のASCII文字を意味します。

答え2

正確に要求されたものではありませんが、調整することができます。

.txtこれにより、現在のディレクトリでサフィックスが付いたすべてのファイルが処理されます。各ファイルについて(例Cairo.txt:):

  1. すべてのスペースを改行文字で置き換えることで、1行に1語の単純なtrリストが生成されます。
  2. fmt指定された長さまでの整数の単語を1行に囲むために使用されます。
  3. splitこの行を一連のCairo.seq.0000ファイル名にするために使用されます。

テスト可能性のために幅60と30行を使用し、入力内容は次のように生成されたプレーンテキストのマニュアルページ3つでした。

for cmd in tr fmt split; do man $cmd | col -b > $cmd.txt; done

スクリプトは次のとおりです。

#! /bin/bash

    for fn in ./*.txt; do
        Base="${fn%.txt}"
        tr -s '[:space:]' '\n' < "${fn}" |
            fmt -60 |
            split -a 4 -d -l 30 - "./${Base}.seq."
    done

fmt コマンドでは、線の幅は「60」です。したがって、この数値を100に設定することをお勧めします。

分割コマンドの各出力ファイルの行数は「30」です。ファイルごとに1行が必要なようです。しかし、これらの小さなファイルがたくさん生成されます。 100バイトファイルはまだ4096バイトのブロックを占めています。

単語数は変わりませんが、スペースが減り、行も減ったことがわかります。

paul $  wc *
   29   214  1561 fmt.seq.0000
   61   214  1832 fmt.txt
   30   260  1665 split.seq.0000
   15   101   780 split.seq.0001
   94   361  2892 split.txt
   30   263  1724 tr.seq.0000
   18   126   929 tr.seq.0001
  124   389  3282 tr.txt
  410  1955 14821 total
paul $ 

関連情報