Разделение большого текстового файла повторяет каждый шаблон x
Я пытаюсь разбить большой файл каждые x образцов безуспешно, как я могу этого добиться?
Структура файла:
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS
> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBDEFWDWDWD
> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU
Он содержит тысячи строк разной длины и несколько строк на заголовок ">". Я хочу разделить этот большой файл на меньшую фильтрацию каждые 100 ">" заголовков на файл, это возможно сделать?
Заранее спасибо!
2 ответа
Вот небольшой 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, для вывода используется новый файл.
Подход 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. Может быть легко изменен для разделения на основе переменной стартовой строки.