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