我有一个包含多个元素<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
另一种方法,但它也失败了
¿任何人都可以帮助我吗?
提前致谢!
答案 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>