고정된 개수의 다중 문자 구분 기호 뒤에 "\n"을 추가합니다.

고정된 개수의 다중 문자 구분 기호 뒤에 "\n"을 추가합니다.

저는 매우 큰 한 줄 텍스트 파일을 구문 분석하여 데이터베이스에 저장하는 임무를 맡고 있습니다. 해당 파일에는 대용량(48GB)의 텍스트 데이터가 포함되어 있으며 다음 형식으로 나에게 제공됩니다.

col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&col1*#(%&col2*#(%&col3*#(%&col4...

따라서 파일의 구분 기호는 "*#(%&"이고 열은 기본적으로 한 행의 col1-col5에서 반복됩니다.

내 목표는 이를 다음과 같은 레코드 형식으로 변환하는 것입니다.

col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&

그래서 나는 5개의 '*#(%&'' 뒤에 '\n'을 추가하고 싶었습니다. 주위를 둘러보면서 이 작업을 수행하는 편리한 sed 명령을 찾았습니다.물건:

sed -r 's/([^\*#\(%\&|]*\*#\(%\&){5}/&\n/g'

그러나 대부분의 경우 이는 col4가 거대한 텍스트 필드이기 때문에 작동하며 col에 단일 문자가 포함된 레코드의 경우'#(%&' 즉 '#', 카운트가 재설정된 것 같고 원하는 대로 동작하지 않습니다. 이 문제가 발생하지 않도록 조정하거나 방지할 수 있는 방법이 있습니까? ' The 정확한 모드#(%&' 나타나다.

답변1

GNU를 사용하면 awk다음을 수행할 수 있습니다.

gawk -v RS='\\*#\\(%&' -v ORS= '{print $0 RT};NR%5 == 0{printf "\n"}'

다음을 사용하십시오 sed(단, 일부 sed구현에서는 행 크기에 대한 제한이 더 낮습니다).

sed 's/*#(%&/&\
/5;P;D'

답변2

perl -F'\*#\(%&' -lane 'print join "*#(%&", splice @F, 0, 5 while @F'

피복재:

 ° Split on the string `*#(%&`  it is stored in the array @F.
 ° Then, while the array still has elements in it, pluck out the leading 5, or whatever are left in the last gasp, and join these with the same string they were split on. And this is printed to stdout followed by a newline which is ensured by the `-l` option. 

관련 정보