다음과 같은 파일이 있습니다.
주요 파일:
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