␁로 구분된 텍스트 스트림 부분을 처리합니다.

␁로 구분된 텍스트 스트림 부분을 처리합니다.

파일 스트림을 stdin더 작은 부분으로 분할하고 각 부분을 스크립트에 전달하는 방법,

다음과 비슷한 대용량 파일이 있습니다 stdin.

␁HeadingHere
abcd
abcd
␁Different Title
bcde
bcde
{a lot longer}
␁Different again!
cdef
cdef   

이 부분을 전달할 방법을 찾고 있습니다../script.sh

이는 다음 작업을 시뮬레이션합니다.

cat <<EOF | ./script.sh
␁HeadingHere
abcd
abcd
EOF

cat <<EOF | ./script.sh
␁Different Title 
bcde
bcde
{a lot longer}
EOF

cat <<EOF | ./script.sh
␁Different again!
cdef
cdef
EOF

각 부분은 분해하여 식별할 수 있습니다 .

xargs비슷한 것을 사용하고 수행하려고 생각했지만 xargs -d '\01' -n1 echo우연히 만났습니다.xargs: argument line too long

이상적으로 스크립트는 다음 posix과 호환됩니다.

답변1

이러한 부분을 별도의 파일로 분할하여 하나씩 처리할 수 있습니다. 이는 outfile.1다음과 같은 결과를 낳습니다:

awk '/^␁/ { count++ } { print > "outfile." count }  ' < file

또는 awk부품을 하나씩 명령에 파이프할 수 있습니다.

awk  'BEGIN {command = "./script.sh"} /^␁/ { close(command) }
      { print | command } ' < file

나는 제목을 시작하기 위해 위에서 문자 그대로 U+2401 표기법을 사용했습니다. 왜냐하면 그것이 복사-붙여넣기를 통해 얻은 것이기 때문입니다. 명령줄에서 사용 했으므로 \01이러한 명령이 있는 경우 xargs코드에서 SOH 물결표를 실제 START OF HEADING으로 변경할 수도 있습니다.\001awk


SOH로 설정할 수도 있지만 RS여기서는 레코드 시작 부분에 SOH가 있고 awk끝 부분에서 레코드 구분 기호를 찾을 것으로 예상하기 때문에 이는 완전히 적절하지 않습니다.

답변2

소스 파일에 빈 줄(두 개의 연속 줄 바꿈)이 없으면 sed를 사용하여 각 빈 줄을 두 개의 줄 바꿈으로 변환할 수 있습니다. 이렇게 하면 각 레코드의 구분 기호로 빈 줄이 있는 파일(또는 스트림)이 생성됩니다. 그런 다음 awk(빈 RS 사용)는 각 "빈 줄"로 구분된 파일(스트림)을 "레코드"로 분리할 수 있습니다.

설명이 복잡해 보일 수 있지만 코드를 살펴보세요.

sed 's/␁/\n\n/g' file | awk -v RS='' -vf="./script" '{print|f;close(f)}'

실제로 바이트 값이 0x01인 문자를 변환해야 하는 경우 sed 명령을 대체하십시오 .\x01

관련 정보