AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1262315
Accepted
Mario Ishac
Mario Ishac
Asked: 2020-07-27 21:28:20 +0800 CST2020-07-27 21:28:20 +0800 CST 2020-07-27 21:28:20 +0800 CST

如何根据行开始将文件拆分为两个?

  • 772

我有这个文件1.txt:

-e a
b
-e c

d
-e e
f

我想将其拆分为以下两个文件。

2.txt

-e a
-e c
-e e

3.txt

b
d
f

where2.txt包含以 开头的所有行-e,并3.txt包含所有其他行。可以忽略或保留额外的换行符(例如原始中间的额外换行符),并且顺序无关紧要。

我尝试过使用split,但它看起来不允许我使用模式进行拆分(而不是每个拆分文件的固定行数)。

command-line regex split
  • 4 4 个回答
  • 1051 Views

4 个回答

  • Voted
  1. Best Answer
    waltinator
    2020-07-27T22:04:26+08:002020-07-27T22:04:26+08:00

    使用grep:

    grep -E '^-e' 1.txt >2.txt
    grep -E '[^-]' 1.txt >3.txt
    

    @braemar:使用grep -v相同的正则表达式会错误地检测空行、文本行等。不是想要的。

    • 3
  2. pa4080
    2020-07-28T00:50:46+08:002020-07-28T00:50:46+08:00

    这是awk解决方案:

    awk '{ if ( /^-/ ) print > "2.txt"; else if ( NF ) print > "3.txt" }' 1.txt
    

    性能测试:

    $ cat 1.txt | wc -l | sed -r -e 's/([0-9]{6}$)/ \1/' -e 's/([0-9]{3}$)/ \1 lines/'
    1 144 270 lines
    $ TIMEFORMAT=%R
    
    $ time awk '{ if ( /^-/ ) print > "2.txt"; else if ( NF ) print > "3.txt" }' 1.txt
    0.372
    
    • 3
  3. steeldriver
    2020-07-28T03:19:04+08:002020-07-28T03:19:04+08:00

    保留空行:

    $ sed -n -e '/^-e/{w 2.txt' -e 'd}' -e 'w 3.txt' 1.txt
    

    给予

    $ head {1,2,3}.txt
    ==> 1.txt <==
    -e a
    b
    -e c
    
    d
    -e e
    f
    
    ==> 2.txt <==
    -e a
    -e c
    -e e
    
    ==> 3.txt <==
    b
    
    d
    f
    

    如果您喜欢省略空行,则在最后写入时添加“任何字符”正则表达式:

    sed -n -e '/^-e/{w 2.txt' -e 'd}' -e '/./w 3.txt' 1.txt
    
    • 2
  4. pa4080
    2020-07-27T21:51:50+08:002020-07-27T21:51:50+08:00

    这是sed使用delete标志的解决方案:

    sed -e '/^-/!d' -e '/^[[:space:]]*$/d' 1.txt > 2.txt
    

    上面的命令有两个正则表达式,第一个'/^-/!d'将匹配所有不以开头的行-并将它们从输出中删除,第二个'/^[[:space:]]*$/d'将匹配所有仅包含空格的行并将它们从输出中删除。

    sed -e '/^-/d' -e '/^[[:space:]]*$/d' 1.txt > 3.txt
    

    上面的命令也有两个正则表达式,第一个'/^-/d'将匹配所有以开头的行-并将它们从输出中删除,第二个与预览情况相同。


    另一种方法是保留-n正常输出,sed然后p仅对匹配的行进行 rint:

    sed -n '/^-/p' 1.txt > 2.txt
    
    sed -n -r '/^(-|[[:space:]]*$)/!p' 1.txt > 3.txt
    

    这是一个性能测试:

    $ cat 1.txt | wc -l | sed -r -e 's/([0-9]{6}$)/ \1/' -e 's/([0-9]{3}$)/ \1 lines/'
    1 144 270 lines
    $ TIMEFORMAT=%R
    
    $ time sed -e '/^-/!d' -e '/^[[:space:]]*$/d' 1.txt > 2.txt
    0.357
    $ time sed -e '/^-/d' -e '/^[[:space:]]*$/d' 1.txt > 3.txt
    0.323
    
    $ time sed -n '/^-/p' 1.txt > 2.txt
    0.221
    $ time sed -n -r '/^(-|[[:space:]]*$)/!p' 1.txt > 3.txt
    0.402
    
    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve