Regex 能够根据模式分割文件,但不能从最后一行中删除换行符
我对awk非常陌生,我想尝试一个基于模式分割文件的简单练习。请注意: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行 以此类推……下面是我尝试过的……
第1行
第2行
第3行
字符串文件2
第1行
第2行
第3行
字符串文件3
第1行
第2行
第3行
找到表达式“string”并将其排除后,立即拆分文件。所以,我的输出是
第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
之后将继续。