Bash

如何按目錄中的字元數拆分文本文件

  • July 1, 2020

我想按給定的字元數將目錄中的多個文本文件分成許多較小的文本文件。例如,我希望將目錄中的每個文件分成每個 100 個字元的較小文本文件。據我了解,linux 中的 split 命令只能按行而不是字元數起作用,所以我不確定這是否有效。

編輯:我也有興趣了解如何按字數劃分文本文件。

如果文件是 ASCII 文本,您可以使用split -b100. 這意味著 100 個字節,始終是 100 個 ASCII 字元。

不完全符合您的要求,但可能會進行調整。

.txt這會處理目前目錄中所有帶後綴的文件。對於每個文件(例如Cairo.txt):

  1. 它用於tr用換行符替換所有空格,得到一個簡單的每行一個單詞列表。
  2. 它用於fmt將整數個單詞打包成行,直到指定長度。
  3. 它用於split將這些行變成一系列命名Cairo.seq.0000和向上的文件。

為了可測試性,我使用了寬度 60 和第 30 行,我的輸入是三個純文字手冊頁,使用以下程式碼生成:

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。

每個輸出文件的行數是 split 命令中的“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 $ 

引用自:https://unix.stackexchange.com/questions/595790