【问题标题】:split text file in two using bash script使用 bash 脚本将文本文件一分为二
【发布时间】:2011-04-08 08:07:02
【问题描述】:

我有一个文本文件,中间有一个标记:

one
two
three
blah-blah *MARKER* blah-blah
four
five
six
...

我只需要将这个文件分成两个文件,第一个包含 MARKER 之前的所有内容,第二个包含 MARKER 之后的所有内容。似乎可以用 awk 或 sed 在一行中完成,我就是不知道怎么做。

我尝试了简单的方法 - 使用 csplit,但 csplit 不能很好地处理 Unicode 文本。

【问题讨论】:

    标签: bash text sed awk split


    【解决方案1】:

    你可以用 awk 轻松做到这一点

    awk -vRS="MARKER" '{print $0>NR".txt"}' file
    

    【讨论】:

    • +1:喜欢它。如此简洁优雅。我一直需要这个来从日志中丢弃大部分垃圾,这些垃圾来自配置不当的构建脚本。
    【解决方案2】:

    试试这个:

    awk '/MARKER/{n++}{print >"out" n ".txt" }' final.txt
    

    它将从 final.txt 读取输入并生成 out1.txt、out2.txt 等...

    【讨论】:

    • 几乎成功了。不会搞砸 UTF-8,但会将 MARKER 留在第二个文件中。
    • 您是否尝试过此处显示的解决方案:unix.com/shell-programming-scripting/… - 它使用csplit 并按照您想要的方式工作,即让标记退出文件。
    • 不像描述的那样工作。需要 "BEGIN{n=1}" 否则初始文件将被命名为 "out.txt" 而不是 "out1.txt"。与你的注释相反。 -- 我试图通过编辑添加它,但它被拒绝了。
    【解决方案3】:
    sed -n '/MARKER/q;p' inputfile > outputfile1
    sed -n '/MARKER/{:a;n;p;ba}' inputfile > outputfile2
    

    或多合一:

    sed -n -e '/MARKER/! w outputfile1' -e'/MARKER/{:a;n;w outputfile2' -e 'ba}' inputfile
    

    【讨论】:

      【解决方案4】:

      split 命令几乎可以满足您的需求:

      $ split -p '\*MARKER\*' splitee 
      $ cat xaa
      one
      two
      three
      $ cat xab
      blah-blah *MARKER* blah-blah
      four
      five
      six
      $ tail -n+2 xab
      four
      five
      six
      

      也许它已经足够满足您的需求了。

      不过,我不知道 Unicode 是否比 csplit 更好。

      【讨论】:

      • 该选项在 GNU coreutils 中包含的 split 版本中似乎不可用;我假设您使用的是某种风格的 BSD。无论如何,在大多数 Linux 发行版等基于 GNU 的操作系统上,coreutils 包括 split 和 csplit,因此它们应该具有类似的 Unicode 行为。
      猜你喜欢
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多