能够根据模式拆分文件,但无法从最后一行删除换行符

时间:2014-07-18 15:09:21

标签: regex bash awk

我是awk的新手,想过尝试基于模式分割文件的简单练习。请注意:

  1. 我的文件是记事本文件.txt(使用CRLF格式)。
  2. 文件中包含以下内容(开头输入文件中没有空行)
  3. string file1
    一号线
    2号线
    3号线
    string file2
    一号线
    2号线
    3号线
    string file3
    一号线
    2号线
    line3中

    1. 我想要实现的目标(此时只想使用awk)?  我找到表达式“string”并将其排除后立即拆分文件。所以,我的输出就像
    2. “file1”仅包含
      一号线
      2号线
      3号线
      “file2”只包含
      一号线
      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脚本吗?

      感谢。

2 个答案:

答案 0 :(得分:0)

感谢大家的所有投入。我能够通过使用下面的代码解决问题。

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} }

但是,如果有人发现更好的方法,请发布!

答案 1 :(得分:0)

我能想到的最好的(类似于你的回答)如下:

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