次のファイルがあります。
主なファイル:
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で、約75,000以上のレコードが含まれています。
これを行うより速い方法がありますか?
答え1
GNU awkを使用すると、次のことを試すことができます。
gawk -v RS='Record[|]' -F'|' '$1{printf "%s%s", RT, $0 > $1}' file
Record|
アクションとして記録区切り記号、我々は簡単に各レコードを得ることができます。 GNU awkはRS
正規表現(この例のように)にすることができ、RT
その式(Record|
)に一致するテキストを含みます。
では使用できないため、mawk
代わりに使用できます。RT
printf "Record|%s", $0
答え2
これで、ファイルの内容に基づいて出力ファイル名を指定する必要がない場合は、coreutils分割これよりも良いかもしれませんawk
csplit file '/^Record[|]/' '{*}'
これによりファイルセットなどが生成されますxx01
。あなたの場合、このファイルは空白なのでxx02
無視しても構いません。また、xx01
出力ファイル名のcsplit
プレフィックス(xx
)とサフィックス(01
、....)部分を設定できます。02