다음과 같은 큰 파일이 있습니다.
Header1
Subheader1
l1
l1'
l1''
Header2
Subheader2
l2
l2'
l2''
Headern
Subheader n
ln
ln'
ln''
(여기서 n은 약 25K)
l1-l1'', l2-l2'' ... ln-ln''
예를 들어 file1, file2, ... file n
파일의 특정 줄 번호 에 붙여넣어야 합니다 .
답변1
헤더와 행 간의 관계를 지정하지 않았습니다. 그러나 관계가 일정한 행 수인 경우 grep을 사용하여 행 번호를 검색한 다음 sed를 사용하여 행을 추출할 수 있습니다.
예를 들어 Subheader 뒤의 모든 행을 가져오려면 다음을 수행하세요.
#!/bin/bash
file_in=/tmp/test.txt
file_out=/tmp/file1.txt
LINES=`grep -n Subheader $file_in | cut -f1 -d:`
for line in $LINES; do
echo $line
line1=$(($line+1))
sed -n ${line1}p $file_in >> $file_out
done
편집: 위 스크립트를 루프로 실행할 수 있습니다.
#!/bin/bash
n_max=100
file_in=/tmp/test.txt
file_out=/tmp/file
LINES=`grep -n Subheader $file_in | cut -f1 -d:`
for n in `seq 1 $n_max`; do
echo "line $n"
for line in $LINES; do
line_n=$(($line+$n))
sed -n ${line_n}p $file_in >> $file_out$n.txt
done
done
exit 0
답변2
우리는 할 수있어:
perl -Mautodie -lne '
if ( /Subheader/ ... /Header/ ) {
open FILE, q[>>], q[file] . ++$a if /Subheader/;
close FILE if /Header/;
print FILE if !/Subheader/ && !/Header/;
}
' large_file.log
그러면 file1, file2 등의 미니 파일이 생성됩니다.
Perl은 Subheader 줄을 만나면 새 파일 핸들을 엽니다. 헤더 라인을 만나면 파일 핸들을 닫습니다. 다른 모든 줄의 경우 파일 핸들에 인쇄됩니다.