파일 스트림을 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으로 변경할 수도 있습니다.\001
awk
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