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

3

我非常新手awk,想尝试一个简单的练习,根据模式拆分文件。请注意:

  1. 我的文件是记事本文件.txt(带有CRLF格式)。
  2. 文件恰好包含以下内容(输入文件开头没有空行)

字符串file1
line1
line2
line3
字符串file2
line1
line2
line3
字符串file3
line1
line2
line3

  1. 我想要实现什么(目前只想使用awk)?
    一旦找到表达式“string”并排除它,就将文件拆分。因此,我的输出将是

"file1"只包含
line1
line2
line3
"file2"只包含
line1
line2
line3

依此类推... 下面是我的尝试...但是在每个文件的结尾和情况A和B的开始处留下了一个换行符。

情况A:

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

CASE B:
案例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脚本吗?

谢谢。


1
无法在GNU Awk 4.0.1中重现“Case A”的预期结果。输出甚至保留了CRLF格式,没有额外的行。 - user000001
你是在Cygwin上运行吗?如果不是,你在什么平台上运行? - Ed Morton
@Ed Morton 我正在虚拟机CentOS上运行此程序,但是访问的是我挂载在Windows 8上的文件。 - Jai
@user000001..情况A会在每个文件的末尾添加一个换行符,因为每个打印语句都会添加一个换行符..如果我没错的话..这就是发生的事情..我不认为awk的版本在这里有任何影响.. - Jai
@Jai 我可以确认 @user000001 的说法:如果我使用CRLF将您的输入复制到文本文件中,并复制粘贴您的CASE A代码,则会生成三个具有3行的文件,CRLF并且开头或结尾没有空行(根据vi)。但是,在文件上运行 od -c 命令后,我可以确认它们确实包含最后的\r\n,如果您想避免这种情况,则您在答案中提供的解决方案似乎是正确的方法。 - mschilli
2个回答

0
我能想到的最好的答案(类似于你的回答)如下所示:
awk -v RS='\r\n' '{if(/string/){of=$2".txt";getline}else printf RS>of}{printf $0>of}' 

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

然而,如果有人发现了更好的方法,请务必发布!


不需要最后的“next”语句,因为它什么也不做:这是最后一条规则,所以在此之后 awk 将继续执行。 - mschilli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接