То, что я хочу знать, это как найти расположение атома H (в виде номера столбца вместо номера символа) в строке / массиве, используя PERL или Bash?Я пытался избежать ненужных циклов поиска в H, потому что мои данные содержат более миллиона строк.
У меня есть данные исследований, показанные ниже
FRAM_# 20000000 5000000(fs) CN= 1 PRMRYTGT 16652 O 16654 H 1.036 8140 CA 2.586 7319 AL 1.963
Где присутствуют атомы O, H, CA и AL.Первый атом представляет собой целевой атом кислорода, а остальные являются соседями, которые связаны с целевым кислородом.За исключением первого атома (кислорода), целое число перед каждым атомом является идентификатором атома, а число с плавающей запятой после него является длиной связи с первым атомом O (ID = 16652).
$line = 'FRAM_# 20000000 5000000(fs) CN= 1 PRMRYTGT 16652'
. ' O 16654 H 1.036 8140 CA 2.586'
. ' 7319 AL 1.963';
@values = split(/\s+/, $line);
my $bondlength;
my $neighbor_ID;
for (my $i = 10; $i <= $#values; $i = $+3) {
if ($values[$i] eq 'H') {
$neighbor_ID = $values[$i-1];
$bondlength = $values[$i+1];
} else {
next;
}
Я могу использовать цикл для поиска позиции H в массиве @values.Тем не менее, есть ли другой способ (не цикл), например, регулярные выражения или сценарии BASH, чтобы получить положение H в массиве?Я очень признателен, если бы вы могли дать мне дополнительное предложение и помощь.
Я хочу найти водородную связь (длина связи более 1,5 ангстрем) между Н и целевым кислородом.Итак, я должен получить ID атома Н и соответствующую длину связи.Итак, во-первых, мне нужно найти местоположение H. А затем найти идентификатор атома и соответствующую длину связи.И тогда я могу сделать дальнейший анализ данных.
ПРИМЕЧАНИЕ. У меня больше 1 млн строк данных, поэтому я должен учитывать эффективность кода.H - мой целевой атом в этом примере.В строках данных количество H может быть различным.