大容量ファイルの一部を複数の出力ファイルにコピーする

大容量ファイルの一部を複数の出力ファイルにコピーする

次のような大きなファイルがあります。

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行に会うと新しいファイルハンドルを開きます。ヘッダー行に遭遇すると、ファイルハンドルを閉じます。他のすべての行については、ファイルハンドルに印刷されます。

関連情報