Bash
如何按目錄中的字元數拆分文本文件
我想按給定的字元數將目錄中的多個文本文件分成許多較小的文本文件。例如,我希望將目錄中的每個文件分成每個 100 個字元的較小文本文件。據我了解,linux 中的 split 命令只能按行而不是字元數起作用,所以我不確定這是否有效。
編輯:我也有興趣了解如何按字數劃分文本文件。
如果文件是 ASCII 文本,您可以使用
split -b100
. 這意味著 100 個字節,始終是 100 個 ASCII 字元。
不完全符合您的要求,但可能會進行調整。
.txt
這會處理目前目錄中所有帶後綴的文件。對於每個文件(例如Cairo.txt
):
- 它用於
tr
用換行符替換所有空格,得到一個簡單的每行一個單詞列表。- 它用於
fmt
將整數個單詞打包成行,直到指定長度。- 它用於
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 $