Я пытаюсь разделить большой файл каждый x шаблоны без успеха, как я могу достигнуть этого?
Файловая структура:
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU
Это имеет тысячи строк с различными длинами и несколько строк на">" заголовок. Я хочу разделить тот большой файл на меньшую фильтрацию каждых 100">" заголовки на файл, который возможно сделать?
Заранее спасибо!
Вот маленький сценарий жемчуга для Вас. Можно сохранить его как 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>";
. Эта строка изменяет разрыв строки по умолчанию charachter (\n
) к "новой строке +>" (\n>
). В цикле с условием продолжения каждое начало блока">" используется сразу. Я использовал две переменные подсчета ($linecount
и $filecount
). Строки (или блоки в этом случае) считаются и когда это количество совершает нападки 100, новый файл используется для вывода.
Сценарий ниже разделяет имя файла, данное на командной строке в файлы однажды определенное количество >
символы были замечены в начале строки. Количество замеченных символов также указано на командной строке. Таким образом синтаксис следующие:
$ ./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. Может легко быть изменен для разделения на основе переменной стартовой строки.