대규모 로그 파일 세트에서 작은 로그 파일 만들기

대규모 로그 파일 세트에서 작은 로그 파일 만들기

다음과 같은 파일이 있습니다.

주요 파일:

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

관련 정보