我尝试按 x 种模式拆分一个大文件,但没有成功,我该如何实现?
文件结构:
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU
它有数千行不同长度的行,每个“>”标题有多行。我想将这个大文件拆分成更小的文件,每个文件每 100 个“>”标题进行过滤,可以做到吗?
提前致谢!
答案1
这是一个小的 perl 脚本。您可以将其另存为split_files.pl
并以 运行perl split_files.pl input.txt
。输出将存储在名为等的文件中chunk_0
。chunk_1
#!/usr/bin/perl
use strict;
use warnings;
my$infile=shift(@ARGV);
my$linecount=0;
my$filecount=0;
my$outfile="chunk_".$filecount;
open(IN,'<',$infile) or die $!;
open(OUT,'>',$outfile) or die $!;
$/="\n>";
while(<IN>)
{
chomp;
$_=~s/>//g;
if($linecount==100)
{
$filecount++;
$outfile="chunk_".$filecount;
close OUT or die $!;
open(OUT,'>',$outfile) or die $!;
$linecount=0;
}
print OUT ">",$_,"\n";
$linecount++;
}
close OUT or die $!;
close IN or die $!;
解释:
脚本的窍门在于行$/="\n>";
。此行将默认换行符 ( \n
) 更改为“换行符 + >” ( \n>
)。在 while 循环中,每个以“>”开头的块都会被使用一次。我使用了两个计数变量($linecount
和$filecount
)。对行(或本例中的块)进行计数,当计数达到 100 时,将使用新文件进行输出。
答案2
Python 方法
下面的脚本会在命令行中指定的文件名在行>
首出现特定数量的字符后将其拆分为文件。命令行中还指定了可见字符的数量。因此语法如下:
$ ./split_file.py input.txt 3
脚本源
#!/usr/bin/env python
import sys
def write_split_file(count,orig_name,lines):
split_name = orig_name + '.split.' + str(count)
with open(split_name,'w') as fd:
fd.write("\n".join(lines))
def main():
counter = 0
limit = int(sys.argv[2])
line_list = []
with open(sys.argv[1]) as fd1:
for line in fd1:
line_list.append(line.strip())
if line.startswith('>'):
counter+=1
if counter % limit == 0:
write_split_file(counter,sys.argv[1],line_list)
line_list = []
if line_list:
write_split_file(counter,sys.argv[1],line_list)
if __name__ == '__main__': main()
注意:该脚本是为 Python 2 编写的,但与 Python 3 兼容。可以轻松修改为基于变量起始字符串进行拆分。