如何在以数字开头的行拆分文本文件
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
我有一个如下所示的文件 ('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