Допустим, у нас есть файл 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-й элемент проверяем регэкспом, если подходит – отправляем на выход.
Комментарии
Отправить комментарий