Я изучаю Perl и пытаюсь понять, как выполнить эту задачу. У меня есть папка с кучей текстовых файлов, и у меня есть файл ions_solvents_cofactors
, который содержит список из трех букв.
Я написал скрипт, который открывает и читает каждый файл в папке и должен удалить те строки, которые под определенной колонкой [3] совпадают с каким-то элементом из списка. Это не работает хорошо. У меня есть какая-то проблема в конце скрипта, и я не могу понять, что это такое.
Я получаю ошибку: rm: invalid option -- '5'
Мой входной файл выглядит так:
ATOM 1592 HD13 LEU D 46 11.698 -10.914 2.183 1.00 0.00 H
ATOM 1593 HD21 LEU D 46 11.528 -8.800 5.301 1.00 0.00 H
ATOM 1594 HD22 LEU D 46 12.997 -9.452 4.535 1.00 0.00 H
ATOM 1595 HD23 LEU D 46 11.722 -8.718 3.534 1.00 0.00 H
HETATM 1597 N1 308 A 1 0.339 6.314 -9.091 1.00 0.00 N
HETATM 1598 C10 308 A 1 -0.195 5.226 -8.241 1.00 0.00 C
HETATM 1599 C7 308 A 1 -0.991 4.254 -9.133 1.00 0.00 C
HETATM 1600 C1 308 A 1 -1.468 3.053 -8.292 1.00 0.00 C
Вот сценарий:
#!/usr/bin/perl -w
$dirname = '.';
opendir( DIR, $dirname ) or die "cannot open directory";
@files = grep( /\.txt$/, readdir( DIR ) );
foreach $files ( @files ) {
open( FH, $files ) or die "could not open $files\n";
@file_each = <FH>;
close FH;
close DIR;
my @ion_names = ();
my $ionfile = 'ions_solvents_cofactors';
open( ION, $ionfile ) or die "Could not open $ionfile, $!";
my @ion = <ION>;
close ION;
for ( my $line = 0; $line <= $#file_each; $line++ ) {
chomp( $file_each[$line] );
if ( $file_each[$line] =~ /^HETATM/ ) {
@is = split '\s+', $file_each[$line];
chomp $is[3];
}
foreach ( $file_each[$line] ) { #line 39
if ( "@ion" =~ $is[3] ) {
system( "rm $file_each[$line]" );
}
}
}
}
Так, например, если 308
из входного файла совпадает в файле ions_cofactors_solvents`, то удалите все эти строки, в которых он совпадает.
Global symbol "$files" requires explicit package name at select_pdb_filesREAL.pl line 11.
Хотя после запуска скрипта он не вносил никаких изменений и не удалял строки в файлах. - person milan   schedule 09.01.2018foreach($file_each[$line])
. Какой список обрабатывать? Какова переменная для каждой записи списка? Сколько записей в списке? - person Yunnosch   schedule 09.01.2018use stricts;
в коде. Теперь вам предстоит работать с этим. Вы должны сохранить его, исправить ошибки, которые он вызывает (например, добавив несколько стратегическихmy
), а затем вернуться с очищенным кодом, который снова выдает первоначальную ошибку. Или, может быть, попытка исправить это. Тогда, пожалуйста, ответьте сами или оставьте вопрос удаленным. - person Yunnosch   schedule 09.01.2018^HETATM
, и взял только четвертый элементis[3]
, но я не помещал эти элементы в массив. Я хотел сказать, что для каждой строки, которая начинается с^HETATM
, посмотрите, совпадают ли элементыis[3]
в каждой строке с тем, что находится в массиве@ion
, и для тех, кто удаляет целые строки из входных файлов. Я также пытался поместить всеis[3]
из каждой строки в массив и, а затем использовать этот массив в цикле foreach, но у меня была та же проблема. - person milan   schedule 09.01.2018rm
! Пожалуйста, приведите пример содержанияions_solvents_cofactors
. - person Borodin   schedule 09.01.2018system
или ``, я могу сделать это так же, как команду bash. Но я, наверное, ошибаюсь. Содержимоеions_solvents_cofactors
представляет собой список различных букв, которые выглядят следующим образом:SB SN IN 008 03S 06C 0KA 0NG 0NM
Итак, если в этом списке найдено308
, я хотел удалить все эти строки, в которых встречается 308. - person milan   schedule 09.01.2018LEU
и308
в вашем образце? - person Borodin   schedule 09.01.2018split /\s+/
, и если вы уверены в этом, вам следует добавить комментарий к коду, чтобы объяснить себя.split ' '
наверное правильно. Это также значение по умолчанию, поэтому, если вы оставите запись файла в$_
, вы можете сказать простоmy @fields = split
. - person Borodin   schedule 09.01.2018