Bash如何使用awk

时间:2018-12-20 09:48:33

标签: awk split csplit

我有一个文本文件(A.in),我想将其拆分为多个文件。每当发现空行时就应该进行拆分。文件名应该是渐进式的(A1.inA2.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

3 个答案:

答案 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终止(请参见herehere)。

正如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