我有一个这样的文件:
主文件:
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[|]/' '{*}'
这将创建一组文件xx01
,xx02
等等。您可以忽略该xx01
文件,因为在您的情况下它将为空。另请注意,它允许您配置输出文件名的csplit
前缀 ( xx
) 和后缀 ( 01
, ....) 部分02