如何在以数字开头的行拆分文本文件

How to split a text file at lines which begin with a number

我有一个如下所示的文件 ('tosplit'):

20210101 等等等等
等等 20210101
等等 20210101
等等 20210101
20210315 等等等等
等等 20210315
等等 20210315
等等 20210315

我想将此文件分成两个文件,如下所示(即,每个文件包含以日期开头的行以及之后和以 'blah' 开头的所有行):
(文件 1)
20210101 等等等等
等等 20210101
等等 20210101
等等 20210101
(文件 2)
20210315 等等等等
等等 20210315
等等 20210315
等等 20210315

使用 csplit (>csplit -z tosplit /2021/ '{*}') 不起作用,因为分隔符在我试图保存为单个文件的块中多次出现。有没有办法根据行的第一个字符是数字而不是字母来拆分?非常感谢。

如果条件总是 2021,您可以尝试这个 awk。 它生成名称为 fileX 的文件(并在不询问的情况下覆盖现有文件),其中 X 是拆分数。

$ awk 'BEGIN{x=1} NR>1 && /^2021/{ close("file"x); x++ } 
    { print > ("file"x) }' tosplit

$ for i in file[12];do echo $i; cat $i ;done      
file1
20210101 blah blah
blah 20210101
blah 20210101
blah 20210101
file2
20210315 blah blah
blah 20210315
blah 20210315
blah 20210315

更通用的版本

$ awk 'BEGIN{x=1} NR>1 && /^[[:digit:]]/{ close("file"x); x++ } 
    { print > ("file"x) }'

鉴于:

cat tosplit
20210101 blah blah
blah 20210101
blah 20210101
blah 20210101
20210315 blah blah
blah 20210315
blah 20210315
blah 20210315
2021 blah
blah

您可以通过添加锚点 ^ 来使用 csplit 以指定仅在行的开头使用 2021:

csplit -z tosplit /^2021/ '{*}'
61
61
15

创建文件:

xx00:
20210101 blah blah
blah 20210101
blah 20210101
blah 20210101
xx01:
20210315 blah blah
blah 20210315
blah 20210315
blah 20210315
xx02:
2021 blah
blah

Try it online