将大文件的各个部分复制到许多输出文件中

将大文件的各个部分复制到许多输出文件中

我有一个大文件,如下所示:

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 行时打开一个新的文件句柄。当遇到标题行时,它会关闭该文件句柄。对于所有其他行,它打印到文件句柄。

相关内容