bash - 在保留行组的同时拆分文件
问题描述
我有一个看起来像的文本文件
[begin]
line1a
line2a
[end]
[begin]
line1b
line2b
[end]
[begin]
line1c
line2c
[end]
每个组都有相同数量的行(在这种情况下为 4,包括开始和结束标记),并且在一个文件中我有许多这样的行组。
我知道该split
命令可以在保留行的同时将文件拆分为 N 个文件,但我想按行将该文件拆分为 N 个文件。所以在这种情况下,每个输出文件应该只包含完整的 4 行组。例如,要拆分为 2 个文件,输出将是
#file1
[begin]
line1a
line2a
[end]
[begin]
line1b
line2b
[end]
#file2
[begin]
line1c
line2c
[end]
有没有可以做到这一点的 Bash 工具?
解决方案
这可能对您有用(GNU split、csplit、ls、sed 和并行):
csplit -sz file '/^\[begin\]/' '{*}' # split each stanza into a separate file xx??
ls xx?? > k # make a list of the above files
split -n l/2 k # put each group of files in a new file x??
parallel -q sed -i 's/.*/cat & \&\& rm &/e' ::: x?? # replace x?? with contents
rm k # clean up
概述:
- 将节拆分
file
为单独的文件 (xx00, xx01, ....
)。 - 列出这些文件(每行一个)并将其放入名为
k
- 将列表
k
分成组(在本例中为 2)命名的新文件xaa, xab, x..
,其中包含单独的节文件的名称xx00, xx01, xx..
- 对于每个
x??
文件,将命名的节文件替换xx??
为其内容,然后删除原始文件。 - 删除
k
文件
推荐阅读
- android - 如何标记 android studio 中的输入文本以在 NLP 模型中处理?
- android - 带有 ViewPager 的 Butterknife NullPointerException
- c# - 使用 SQL Server 表中的列填充 CartesianChart 标签
- hibernate - 将缓存与 Spring Boot 集成
- sql - 日期之间的左连接匹配
- python - 在 Python 中的列表中切片元组
- multithreading - 图片未在视图控制器启动 Swift 时加载
- html - 为什么 HTML 可拖动元素与父背景一起拖动?
- python - if python语句中的多个and
- angular - 如何在浏览器中有效地渲染数百个角高图而不会崩溃?