대용량 파일의 일부를 여러 출력 파일로 복사

대용량 파일의 일부를 여러 출력 파일로 복사

다음과 같은 큰 파일이 있습니다.

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 줄을 만나면 새 파일 핸들을 엽니다. 헤더 라인을 만나면 파일 핸들을 닫습니다. 다른 모든 줄의 경우 파일 핸들에 인쇄됩니다.

관련 정보