【问题标题】:csplit produces too few output files, expecting morecsplit 产生的输出文件太少,期望更多
【发布时间】:2010-12-01 11:09:52
【问题描述】:

我有一个包含如下几行的文件:

1291126929200 started 88 videolist15.txt 4 Good 4
1291126929250 59.875 29.0 29.580243595150186 43.016096916037604
1291126929296 59.921 29.0 29.52749417740926 42.78632483544682
1291126929359 59.984 29.0 29.479540161281143 42.56031951027556
1291126929437 60.046 50.0 31.345036510255586 42.682281485516945
1291126932859 started 88 videolist15.txt 5 Good 4

我想为包含started(或videolist,没关系)的每一行拆分文件。

以下命令只产生 2 个输出文件:

$ csplit -k input.txt /started/

但我期待更多,如下所示:

$ grep -i started input.txt |wc -l
$ 146

正确的csplit 命令是什么?

【问题讨论】:

    标签: regex split


    【解决方案1】:

    在末尾添加{*}

    $ csplit -k input.txt /started/ {*}
    

    手册页说:

    {*}    repeat the previous pattern as many times as possible.
    

    请注意,某些 shell 可能会将其解释为特殊模式。在这种情况下,请使用"{*}" 引用它。

    另外,请确保您使用 GNU 版本的 csplit,它在 macOS 下可用 brew install coreutils

    演示:

    $ cat file
    1
    foo
    2
    foo
    3
    foo
    $ csplit -k file /foo/ {*}
    2
    6
    6
    4
    $ ls -tr xx*             
    xx03  xx02  xx01  xx00
    $ csplit --version
    csplit (GNU coreutils) 7.4
    

    【讨论】:

    • 不幸的是,这给了我:csplit: *}: bad repetition count。不过,它适用于任意数字。谢谢你的提示。
    • @slhck:对我来说很好用。我添加了一个演示运行。我看看是不是版本问题。
    • 我明白了。我有与 OS X 捆绑在一起的 BSD 版本,它甚至没有 --version 开关。
    • @slhck {*} 是一个方便的 GNU 扩展。其他csplit 实现需要明确的重复计数。有时您可以使用一个非常大的数字 ({999999999}),而其他时候您需要一个 first pass with grep
    • @slhck On OSX {*} 不受支持,但您可以使用自制软件 (brew install coreutils) 获取流行命令行工具的 gnu 版本。您可以通过在命令名称前加上“g”前缀来访问它们,例如在本例中为 gcsplit
    【解决方案2】:

    根据 Open Group 规范,csplit 命令接受 basic regular expressions

    基本正则表达式是完整正则表达式实现的有限子集。它们支持文字字符、星号 (*)、点 (.)、字符类 ([0-9]) 和锚点 (^,$)。它们支持一个或多个 (+) 或交替 (a|b)。

    【讨论】:

    • 这与我多年前回答的实际问题无关。
    • @slhck 这些信息是否可以帮助其他在自己的情况下尝试使用 csplit 时偶然发现这个问题的人?
    • 这是非常的一般信息,尽管除了对问题的实际答案当然会很好。就目前而言,这更适合作为评论。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2018-07-31
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多