我有一个文本文件(A.in
),我想将其拆分为多个文件。每当发现空行时就应该进行拆分。文件名应该是渐进式的(A1.in
,A2.in
,..)
我找到了this的建议使用awk
的答案,但我无法使其符合我想要的命名约定
awk -v RS="" '{print $0 > $1".txt"}' file
我还发现other answers告诉我使用命令csplit -l
,但是我无法使其与空行匹配,我尝试匹配模式''
,但我并不熟悉正则表达式,我得到以下
bash-3.2$ csplit A.in ""
csplit: : unrecognised pattern
输入文件:
A.in
4
RURDDD
6
RRULDD
KKKKKK
26
RRRULU
所需的输出:
A1.in
4
RURDDD
A2.in
6
RRULDD
KKKKKK
A3.in
26
RRRULU
答案 0 :(得分:3)
awk的另一种解决方法:
$ awk -v RS="" '{
split(FILENAME,a,".") # separate name and extension
f=a[1] NR "." a[2] # form the filename, use NR as number
print > f # output to file
close(f) # in case there are MANY to avoid running out f fds
}' A.in
答案 1 :(得分:2)
在任何正常情况下,以下脚本都可以工作:
awk 'BEGIN{RS=""}{ print > ("A" NR ".in") }' file
此操作可能失败的原因很可能是由于某些CRLF终止(请参见here和here)。
正如James所提到的,使其具有以下优点:
awk 'BEGIN{RS=""}{ f = "A" NR ".in"; print > f; close(f) }' file
如果您想使用csplit
,则可以使用以下技巧:
csplit --suppress-matched -f "A" -b "%0.2d.in" A.in '/^$/' '{*}'
请参阅man csplit
了解以上内容。
答案 2 :(得分:0)
输入文件内容:
$ cat A.in
4
RURDDD
6
RRULDD
KKKKKK
26
RRRULU
AWK文件内容:
BEGIN{
n=1
}
{
if(NF!=0){
print $0 >> "A"n".in"
}else{
n++
}
}
执行:
awk -f ctrl.awk A.in
输出:
$ cat A1.in
4
RURDDD
$ cat A2.in
6
RRULDD
KKKKKK
$ cat A3.in
26
RRRULU
PS:无需AWK文件的单线执行:
awk 'BEGIN{n=1}{if(NF!=0){print $0 >> "A"n".in"}else{n++}}' A.in