Regex 能够根据模式分割文件,但不能从最后一行中删除换行符

Regex 能够根据模式分割文件,但不能从最后一行中删除换行符,regex,bash,awk,Regex,Bash,Awk,我对awk非常陌生,我想尝试一个基于模式分割文件的简单练习。请注意: 我的文件是记事本文件.txt(CRLF格式) 文件包含以下内容(输入文件开头没有空行) 字符串文件1 第1行 第2行 第3行 字符串文件2 第1行 第2行 第3行 字符串文件3 第1行 第2行 第3行 我想要实现什么(此时只想使用awk)? 找到表达式“string”并将其排除后,立即拆分文件。所以,我的输出是 “文件1”仅包含 第1行 第2行 第3行 “文件2”仅包含 第1行 第2行 第3行 以此类推……下面是我尝试过的……

我对awk非常陌生,我想尝试一个基于模式分割文件的简单练习。请注意:

  • 我的文件是记事本文件.txt(CRLF格式)
  • 文件包含以下内容(输入文件开头没有空行)
  • 字符串文件1
    第1行
    第2行
    第3行
    字符串文件2
    第1行
    第2行
    第3行
    字符串文件3
    第1行
    第2行
    第3行

  • 我想要实现什么(此时只想使用awk)?
    找到表达式“string”并将其排除后,立即拆分文件。所以,我的输出是
  • “文件1”仅包含
    第1行
    第2行
    第3行
    “文件2”仅包含
    第1行
    第2行
    第3行

    以此类推……下面是我尝试过的……但在案例a和案例B中,它分别在每个文件的末尾和开头留下了一条新行

    案例A:

    BEGIN {RS="\r\n";FS=" ";ORS="\r\n"}  
    /string/ { fname = $2; next } { print > fname".txt"}
    
    案例B:

    BEGIN {RS="\r\n"; FS=" "; ORS=""}
    /string/ { if (NR>2) print prev_line>fname".txt"; fname=$2; next} {print (prev_line="") ? $0 : "\r\n" $0 > fname".txt"; prev_line=$0}
    
    有人能为我提供一些更好的方法/提示来修改上述awk脚本吗


    谢谢。

    谢谢大家的投入。我使用下面的代码解决了这个问题

    BEGIN {RS="\r\n"; FS=" "; ORS=""}  
    /string/ { fname=$2; ctr=1; next } { if (ctr==1) {print $0>fname".txt";ctr=0} else {print "\r\n" $0>fname".txt";next} }
    

    然而,如果有人找到了更好的方法,请发布它

    我能想到的最好答案(与您的答案类似)如下:

    awk -v RS='\r\n' '{if(/string/){of=$2".txt";getline}else printf RS>of}{printf $0>of}' 
    

    无法使用
    GNU Awk 4.0.1
    “案例A”按预期工作。输出甚至保留了CRLF格式,没有多余的行您在cygwin上运行这个吗?如果没有,,什么平台?@Ed Morton我在VM centos上运行这个,但在我安装的windows 8上访问文件。@user000001..案例a会在每个文件的最后添加一个新行,因为每个打印stmt都会添加一个新行..如果我没有错…发生了什么…我认为awk的版本在这里不重要..@Jai我可以确认@user000001:如果我复制你的使用CRLF输入文本文件并复制粘贴您的案例代码它生成三个文件,每个文件有3行,CRLF,开头或结尾没有空行(根据
    vi
    )。但是,在文件上运行
    od-c
    时,我可以确认它们确实包含最终的
    \r\n
    ,如果您想避免这种情况,您在回答中给出的解决方案似乎是可行的。不需要最后的
    next
    语句,因为它不起任何作用:这是最后一条规则,因此
    awk
    之后将继续。