首页 > 解决方案 > 在保留行组的同时拆分文件

问题描述

我有一个看起来像的文本文件

[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 工具?

标签: bashawksedsplit

解决方案


这可能对您有用(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文件

推荐阅读