大規模なログファイルセットから小さなログファイルを作成する

大規模なログファイルセットから小さなログファイルを作成する

次のファイルがあります。

主なファイル:

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代わりに使用できます。RTprintf "Record|%s", $0

答え2

これで、ファイルの内容に基づいて出力ファイル名を指定する必要がない場合は、coreutils分割これよりも良いかもしれませんawk

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

これによりファイルセットなどが生成されますxx01。あなたの場合、このファイルは空白なのでxx02無視しても構いません。また、xx01出力ファイル名のcsplitプレフィックス(xx)とサフィックス(01、....)部分を設定できます。02

関連情報