Bash 如何使用 awk 在空行上拆分文件
Bash how to split file on empty line with awk
我有一个文本文件 (A.in
),我想将它拆分成多个文件。每次发现空行时都应该进行拆分。文件名应该是渐进的 (A1.in
, A2.in
, ..)
我找到了 this 建议使用 awk
的答案,但我无法使用我想要的命名约定
awk -v RS="" '{print [=11=] > ".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
在任何正常情况下,以下脚本应该有效:
awk 'BEGIN{RS=""}{ print > ("A" NR ".in") }' file
这可能失败的原因很可能是由于某些 CRLF 终止(参见 and 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
以了解上述内容。
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
输入文件内容:
$ cat A.in
4
RURDDD
6
RRULDD
KKKKKK
26
RRRULU
AWK 文件内容:
BEGIN{
n=1
}
{
if(NF!=0){
print [=11=] >> "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 [=14=] >> "A"n".in"}else{n++}}' A.in
我有一个文本文件 (A.in
),我想将它拆分成多个文件。每次发现空行时都应该进行拆分。文件名应该是渐进的 (A1.in
, A2.in
, ..)
我找到了 this 建议使用 awk
的答案,但我无法使用我想要的命名约定
awk -v RS="" '{print [=11=] > ".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
在任何正常情况下,以下脚本应该有效:
awk 'BEGIN{RS=""}{ print > ("A" NR ".in") }' file
这可能失败的原因很可能是由于某些 CRLF 终止(参见
正如 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
以了解上述内容。
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
输入文件内容:
$ cat A.in
4
RURDDD
6
RRULDD
KKKKKK
26
RRRULU
AWK 文件内容:
BEGIN{
n=1
}
{
if(NF!=0){
print [=11=] >> "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 [=14=] >> "A"n".in"}else{n++}}' A.in