zsh 中的 csplit:根据模式拆分文件
csplit in zsh: splitting file based on pattern
我想根据模式拆分以下文件 ABC
:
ABC
4
5
6
ABC
1
2
3
ABC
1
2
3
4
ABC
8
2
3
获取文件 1:
ABC
4
5
6
文件 2:
ABC
1
2
3
等等
正在查看 man csplit
的文档:csplit my_file /regex/ {num}
。
我可以使用 csplit my_file '/^ABC$/' {2}
拆分此文件,但这需要我输入 {num}
的数字。当我尝试与假设尽可能重复模式的 {*}
匹配时,出现错误:
csplit: *}: bad repetition count
我正在使用 zshell。
要按照这样的模式拆分文件,我会转向 awk
:
awk 'BEGIN { i=0; }
/^ABC/ { ++i; }
{ print >> "file" i }' < input
这从名为 input
的文件中读取行;在读取任何行之前,BEGIN
部分明确地将“i
”变量初始化为零; awk 中的变量默认为零,但明确无误。 “i”变量是我们对序列文件名的索引。
随后,以“ABC”开头的每一行都会递增这个“i
”变量。
然后文件中的任何一行都将打印(以附加模式)到从文本“file”和“i”变量的当前值生成的文件名。
我想根据模式拆分以下文件 ABC
:
ABC
4
5
6
ABC
1
2
3
ABC
1
2
3
4
ABC
8
2
3
获取文件 1:
ABC
4
5
6
文件 2:
ABC
1
2
3
等等
正在查看 man csplit
的文档:csplit my_file /regex/ {num}
。
我可以使用 csplit my_file '/^ABC$/' {2}
拆分此文件,但这需要我输入 {num}
的数字。当我尝试与假设尽可能重复模式的 {*}
匹配时,出现错误:
csplit: *}: bad repetition count
我正在使用 zshell。
要按照这样的模式拆分文件,我会转向 awk
:
awk 'BEGIN { i=0; }
/^ABC/ { ++i; }
{ print >> "file" i }' < input
这从名为 input
的文件中读取行;在读取任何行之前,BEGIN
部分明确地将“i
”变量初始化为零; awk 中的变量默认为零,但明确无误。 “i”变量是我们对序列文件名的索引。
随后,以“ABC”开头的每一行都会递增这个“i
”变量。
然后文件中的任何一行都将打印(以附加模式)到从文本“file”和“i”变量的当前值生成的文件名。