从一大组记录文件创建小记录文件

从一大组记录文件创建小记录文件

我有一个这样的文件:

主文件:

Record|1111|ABC     
text in between for record 1     
text in between for record 1     
Record|2222|XYZ     
text in between for record 2     
Record|3333|XYZ     
text in between for record 3 

我想创建包含每个记录数据的较小文件

文件 :1111

Record|1111|ABC    
text in between for record 1    
text in between for record 1

文件 :2222

Record|2222|XYZ
text in between for record 2

文件 :3333

Record|3333|XYZ
text in between for record 3

目前我正在使用 awk 来执行此操作:

awk -F"|" '
/Record/{ 
        if(s>0) {
             print line > r;
         }
s=1; 
r=$2; 
line=$0 
} 
!/Record/
{ 
line=line"\n"$0; 
}

END
{
    print line > r;
}' file

但处理文件需要更多时间。每个文件大小为 4GB,将包含大约 75k+ 记录。

有没有更快的方法来做到这一点?

答案1

使用 GNU awk,您可以尝试:

gawk -v RS='Record[|]' -F'|' '$1{printf "%s%s", RT, $0 > $1}' file

Record|作为记录分隔符,我们可以轻松获取每条记录。 GNU awkRS可以是正则表达式(如本例所示),并RT包含与该表达式匹配的文本 ( Record|)。

对于mawk,RT不可用,因此您可以改用printf "Record|%s", $0

答案2

现在,如果可以删除将输出文件名基于文件内容的需要,则 coreutils分割这可能比awk

csplit file '/^Record[|]/' '{*}'

这将创建一组文件xx01xx02等等。您可以忽略该xx01文件,因为在您的情况下它将为空。另请注意,它允许您配置输出文件名的csplit前缀 ( xx) 和后缀 ( 01, ....) 部分02

相关内容