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