Unix 段落模式下的Awk命令,但跳过空行

Unix 段落模式下的Awk命令,但跳过空行,unix,awk,paragraph,blank-line,Unix,Awk,Paragraph,Blank Line,我有一个包含多个元素的文件…。我需要将此文件拆分为n文件,每个文件包含m元素(参数传递给我正在使用的awk命令)。例如,如果我的原始文件有40个元素,我希望将其拆分为3个文件(10个元素、13个元素和17个元素) 问题是原始文件中的元素具有不同的结构 EDITED AFTER fedorqui comment: I use as awk command as files I want to get at the end of the process. That means If I need

我有一个包含多个元素的文件
。我需要将此文件拆分为
n
文件,每个文件包含
m
元素(参数传递给我正在使用的awk命令)。例如,如果我的原始文件有40个元素,我希望将其拆分为3个文件(10个元素、13个元素和17个元素)

问题是原始文件中的元素具有不同的结构

EDITED AFTER fedorqui comment:
I use as awk command as files I want to get at the end of the process. 
That means If I need 3 files with m1, m2 and m3 elements, I will 
execute 3 awk with different parameters
输入示例(file.txt)(5个元素)

aaaaaa 1
AAAAA 2
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
BBBBBB2
ccccc
中交
如您所见,第1/2/4个元素在一行中,第3个元素在3行中,没有空行,而5h元素在3行中,有空行

元素之间的空行不成问题,但元素内部的空行失败

所需输出的示例:

文件_1.txt(2个元素)

aaaaaa 1
AAAAA 2
文件_2.txt(2个元素)

bbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
BBBBBB2
文件_3.txt(1个元素)

ccccc
中交
AWK命令

(suffixFile是文件的后缀号。例如fileAux_1.txt、fileAux_2.txt…)

尝试1

awk-v numElems=$1-v后缀文件=$2'{
对于(i=1;i“fileAux_u2;”suffixFile.txt)
}
}'RS='FS='file.txt
除了元素中的空行之外,它也可以工作。我理解它失败的原因,因为RS=''告诉awk按空行分割

尝试2

awk-v numElems=$1-v后缀文件=$2'{
对于(i=1;i“fileAux_u2;”suffixFile.txt)
}
}'RS='FS='file.txt
另一个方案也失败了

有人能帮我吗


提前感谢!

假设我正确理解了您的挑战,以下是我的尝试:

$ cat script.sh 
#!/bin/bash

awk -v numElems=$1 -v suffixFile=$2 '
        /<elem>/{var++}
        /<\/elem>/{var--; count++} 
        {if(count < numElems || (count == numElems && var == 0)) {
                print $0 >> "file_"suffixFile".txt"
        } else {
                print $0
        } }' $3

如何确定哪些内容应该转到
文件1
以及哪些内容应该转到
文件2
?是否基于
标记内容中的第一个字母?哪一个指向哪个文件并不重要(我将两个参数传递给awk命令以处理此问题)。我的意思是使用(例如)“awk-va=3-vb=1….file.txt”为了将3个元素发送到文件_1.txt,为了将2个元素发送到文件_2.txt,为了“awk-va=2-vb=2…file.txt”,我已经用这个澄清编辑了这篇文章(谢谢)您很好地详细说明了问题,但我仍然不清楚整个问题。您能提供一个有效的示例输入和输出吗?然后,显示一个无效的示例输入(我假设它就是您现在显示的示例输入)并准确指出输出的哪一部分是错误的?好的,fedorqui。我会在回复中回答你,因为编辑文本区域比回复文本区域更糟糕哇,我刚刚意识到这是两年多前提出的问题!很抱歉回复太晚:P
<elem>aaaaaaaa1</elem>
<elem>aaaaaaaa2</elem>
<elem>bbbbbbbb
bbbbbbbbb
bbbbbbbbb</elem>
<elem>bbbbbbbb2</elem>
<elem>ccccc

cccc</elem>
awk -v numElems=$1 -v suffixFile=$2 '{
    for(i=1;i<=numElems;i++) {
        printf "<doc>"$i > "fileAux_" suffixFile".txt"
    }
}' RS='' FS='<doc>' file.txt
awk -v numElems=$1 -v suffixFile=$2 '{
    for(i=1;i<=numElems;i++) {
        printf $i > "fileAux_" suffixFile".txt"
    }
}' RS='<doc>' FS='<doc>' file.txt
$ cat script.sh 
#!/bin/bash

awk -v numElems=$1 -v suffixFile=$2 '
        /<elem>/{var++}
        /<\/elem>/{var--; count++} 
        {if(count < numElems || (count == numElems && var == 0)) {
                print $0 >> "file_"suffixFile".txt"
        } else {
                print $0
        } }' $3
$ ./script.sh 2 1 file.txt | ./script.sh 2 2 | ./script.sh 1 3
$ tail -n +1 file_*
==> file_1.txt <==
<elem>aaaaaaaa1</elem>
<elem>aaaaaaaa2</elem>

==> file_2.txt <==
<elem>bbbbbbbb
bbbbbbbbb
bbbbbbbbb</elem>
<elem>bbbbbbbb2</elem>

==> file_3.txt <==
<elem>ccccc

cccc</elem>