【问题标题】:How do you split a file base on a token?如何根据令牌拆分文件?
【发布时间】:2010-09-22 08:59:33
【问题描述】:

假设您有一个文件,其中包含由 $ 分隔的文本(从 1 到 N) 如何分割文件以使最终结果是 N 个文件?

text1 带有换行符 $
text2 $等... $
正文N

我正在考虑使用 awk 或 sed,但是否有任何可用的 unix 应用程序已经执行此类任务?

【问题讨论】:

    标签: unix command-line awk


    【解决方案1】:

    也许split -p 模式

    嗯。这可能不是你想要的。它不会分割一行,它只会在看到该模式时启动一个新文件。而且它似乎只在 BSD 相关系统上受支持。

    你可以使用类似的东西:

    awk 'BEGIN {RS = "$"} { ... }'
    

    编辑:您可能会在这里找到{ ... } 部分的灵感:

    http://www.gnu.org/manual/gawk/html_node/Split-Program.html

    编辑:感谢 dmckee 的评论,但csplit 似乎也复制了出现该模式的整行。

    【讨论】:

    • 嗯,我的 split 没有 -p 选项 - 那是什么操作系统?
    • Mac OS 有它。还要考虑“csplit”。
    • 我使用的是基于 BSD UNIX 的 Mac OS X。见freebsd.org/cgi/man.cgi?query=split
    • 我发现了 awk 脚本的 RS 部分,它仍然是让我感到困惑的“...”部分。顺便说一句,split 在 cygwin 上没有 -p。
    • Cygwin 基于 GNU,而不是 BSD。不过没关系,split -p 不是你想要的。
    【解决方案2】:

    如果我没看错的话,UNIX cut 命令可以用于此。

    cut -d $ -f 1- filename
    

    我的语法可能略有偏差,但这应该告诉 cut 您正在使用 $ 分隔字段并返回字段 1 到末尾。

    您可能需要转义 $。

    【讨论】:

    • 这不是每行,而且不会产生多个文件吗?
    【解决方案3】:

    awk '开始{RS="$"; ORS=""} { textNumber++; print $0 > "text"textNumber".out" }' 文件名

    感谢 Bill Karwin 的创意。

    编辑:添加 ORS="" 以避免在每个文件的末尾打印换行符。

    【讨论】:

      【解决方案4】:
      awk -vRS="$" '{ print $0 > "text"t++".out" }' ORS="" file
      

      【讨论】:

        【解决方案5】:

        使用 split 命令我们可以使用字符串进行拆分。

        但 csplit 命令也允许您根据正则表达式分割文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-09
          • 2017-07-23
          • 2018-11-04
          • 1970-01-01
          • 2017-06-21
          • 1970-01-01
          相关资源
          最近更新 更多