【问题标题】:csplit in zsh: splitting file based on patternzsh 中的 csplit:基于模式拆分文件
【发布时间】:2021-10-19 16:23:11
【问题描述】:

我想根据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。

【问题讨论】:

  • 在此处查看兼容性讨论:stackoverflow.com/a/4323899/12109043 了解解决方法。
  • @vbfh :我的csplit 甚至没有重复计数参数。你在哪个平台?顺便说一句,如果你输入一个高得离谱的代表数(例如 9999)会发生什么?

标签: zsh csplit


【解决方案1】:

要以这样的模式拆分文件,我会求助于awk

awk 'BEGIN { i=0; } 
     /^ABC/ { ++i; } 
     { print >> "file" i }' < input

这会从名为input 的文件中读取行;在读取任何行之前,BEGIN 部分将“i”变量显式初始化为零; awk 中的变量默认为零,但明确表示永远不会有坏处。 “i”变量是我们对串行文件名的索引。

随后,以“ABC”开头的每一行都会增加这个“i”变量。

文件中的每一行都将被打印(以附加模式)到由文本“file”和“i”变量的当前值生成的文件名。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2017-10-17
    • 2023-04-01
    • 1970-01-01
    • 2020-02-07
    • 2015-08-08
    • 1970-01-01
    • 2017-10-12
    • 2019-07-14
    相关资源
    最近更新 更多