![如何按目录中的字符数拆分文本文件](https://linux22.com/image/176113/%E5%A6%82%E4%BD%95%E6%8C%89%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E6%95%B0%E6%8B%86%E5%88%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6.png)
我想按给定的字符数将目录中的多个文本文件划分为许多较小的文本文件。例如,我希望目录中的每个文件都分为每个 100 个字符的较小文本文件。据我了解,linux 中的 split 命令仅按行数而不是字符数起作用,所以我不确定这是否有效。
编辑:我也有兴趣了解如何按字数划分文本文件。
答案1
如果文件是 ASCII 文本,则可以使用split -b100
.这意味着 100 个字节,始终是 100 个 ASCII 字符。
答案2
不完全符合您的要求,但可能会进行调整。
.txt
这将处理当前目录中带有后缀的所有文件。对于每个文件(例如Cairo.txt
):
- 它用
tr
换行符替换所有空格,得到一个简单的每行一个单词列表。 - 它用于
fmt
将整数个单词打包成行,直到指定的长度。 - 它用于
split
将这些行制作成一系列名为Cairo.seq.0000
和 up 的文件。
为了可测试性,我使用了宽度 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 $