giz*_*zmo 1 shell-script text-processing files
我是 Unix 世界的新手,我有包含 1200 页的文本文件,以^L. 有没有一种有效的方法可以打破该文件,使每个文件有 2 个单独的文件,每个文件有 500 页,然后是第 3 个文件,其余的页面。
我在想像读取文件以定位第一个^L然后将接下来的 500 个输出计数到临时文件,继续读取以创建下一个临时文件还是有更有效的方法?
我的脚本是用运行MKS 工具包的bash 编写的。
假设每一页都以^L(一个字面量Ctrl+L)开头:
awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } { print > f }' file.txt
Run Code Online (Sandbox Code Playgroud)
这将计算行数^L,如果计数减 1 是 500 的因子(第 1 页、第 501 页、第 1001 页等),它将将该变量f设置为文件名以将以下文本输出到其中。
将^L在awk代码是不是两个字符^和L,但文字Ctrl+L(您可以键入此用Ctrl+VCtrl+L)。你也可以用它\014来代替。
对于一个小的测试文档test.txt:
^L
page 1
^L
page 2
^L
page 3
^L
page 4
Run Code Online (Sandbox Code Playgroud)
... 并将 500 更改为 2 以进行测试,这将生成两个文件test.txt-page-1.txt和test.txt-page-3.txt,每个文件包含来自输入文件的两行(页面标记和文本)。
test.txt-page-1.txt:
^L
page 1
^L
page 2
Run Code Online (Sandbox Code Playgroud)
test.txt-page-3.txt:
^L
page 3
^L
page 4
Run Code Online (Sandbox Code Playgroud)
要解析的文件显然在第一页标记之前有一个标题。这个头需要被忽略。上述awk命令的以下变体执行此操作:
awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } p > 0 { print > f }' file.txt
Run Code Online (Sandbox Code Playgroud)
通过将输出限制p为大于零的时间,我们要求在输出任何内容之前至少已解析一个页面标记。