Обработка файлов на Perl



Допустим, у нас есть файл input.txt, содержащий множество строк и несколько tab-separated столбцов (разделитель столбцов, впрочем, может быть и любым другим). Например, вот так:

30  60  GO:0000059  import into nucleus  Protein  Q6ZL37  OJ1699_E05.43    Oryza sativa
31  60  GO:0000054  protein docking      Protein  Q6AV40  OSJNBa0063J18.2  Oryza sativa
32  60  GO:0000059  import into nucleus  Protein  Q5VN12  P0676F10.14      Zea mays
33  63  GO:0000062  acyl-CoA binding     Protein  Q84SC3  P0577B11.140     Oryza sativa
34  63  GO:0000062  acyl-CoA binding     Protein  Q75G87  Os03g0576600     Zea mays

Задач по обработке такого файла можно поставить несколько. И языков и способов их решения может быть полным-полно. Я напишу, как это можно сделать на Perl. Просто и быстро, скрипт можно написать в любом текстовом редакторе, главное, чтобы в системе был интерпретатор Perl.

Способ применения: пишем скрипт parse.pl Кладем файл input.txt в ту же папку, что и скрипт и запускаем из командной строки: perl parse.pl . Если нет желания копировать файлы, прописываем пути в скрипте.


1. Выделить несколько столбцов и записать в новый файл output.txt. Допустим, нам нужны столбцы 3, 6 и 8. Вот программа на перле, которая это делает.

#!c:/Perl/bin/perl
open (IN, "<input.txt") || die $!;
open (OUT, ">output.txt") || die $!;
while(<IN>){
   print OUT join "\t", (split /\t/)[2,5,7], "\n";
}
close OUT;
close IN;

А теперь словами: задаем путь к интерпретатору, открываем файлы. Читаем построчно входной файл в переменную по умолчанию $_, разбиваем ее по табам /\t/, делаем срез массива – (выбираем элементы с нужными индексами, помним про нумерацию массива с 0), потом снова объединяем выбранные элементы табами, пишем в файл, переводя строки. Закрываем файлы.


2. Выбрать строки с заданным значением в одном из столбцов. Пользователи Линукса смогут это сделать в одну строчку grepом. Например, выбираем строки, 8-й столбец которых начинается с Oryza

#!c:/Perl/bin/perl
open (IN, "<input.txt") || die $!;
open (OUT, ">output.txt") || die $!;
while(<IN>){
   split /\t/;
   print OUT $_ if($_[7] =~/^Oryza/);
}
close OUT;
close IN;

То же, что и в прошлый раз. По умолчанию split разбивает аргумент в массив @_, его 8-й элемент проверяем регэкспом, если подходит – отправляем на выход.

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешаю теги: <a> <em> <strong> <pre> <ul> <ol> <li>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Подробнее о форматировании

Image CAPTCHA
Регистр символов учитывается.