在段落模式下执行awk命令但跳过空白行

时间:2015-01-09 12:17:54

标签: unix awk paragraph blank-line

我有一个包含多个元素<elem>...</elem>的文件。我需要将此文件拆分为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个元素)

<elem>aaaaaaaa1</elem>
<elem>aaaaaaaa2</elem>
<elem>bbbbbbbb
bbbbbbbbb
bbbbbbbbb</elem>
<elem>bbbbbbbb2</elem>
<elem>ccccc

cccc</elem>

如您所见,第1 /第2 /第4个元素在一行中,第3个元素在3行中没有空行,5h元素在3行中有空行。

  

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

所需输出的示例:

file_1.txt(2个元素)

<elem>aaaaaaaa1</elem>
<elem>aaaaaaaa2</elem>

file_2.txt(2个元素)

<elem>bbbbbbbb
bbbbbbbbb
bbbbbbbbb</elem>
<elem>bbbbbbbb2</elem>

file_3.txt(1个元素)

<elem>ccccc

cccc</elem>

AWK命令

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

Attempt1

awk -v numElems=$1 -v suffixFile=$2 '{
    for(i=1;i<=numElems;i++) {
        printf "<doc>"$i > "fileAux_" suffixFile".txt"
    }
}' RS='' FS='<doc>' file.txt

除元素内的空行外,可以工作。我明白为什么它会失败,因为RS =''告诉awk用空行分割

尝试2

awk -v numElems=$1 -v suffixFile=$2 '{
    for(i=1;i<=numElems;i++) {
        printf $i > "fileAux_" suffixFile".txt"
    }
}' RS='<doc>' FS='<doc>' file.txt

另一种方法,但它也失败了

¿任何人都可以帮助我吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

假设我理解你的挑战,这是我的尝试:

$ 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

该脚本主要使用<elem>跟踪</elem>var个闭包,并使用count计算对。然后if语句决定是否将该行推送到该文件。达到元素总数后,将返回文件的其余部分,以便您可以使用管道重复该过程。

以下是如何使用最终输出运行它的示例:

$ ./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>