Мне не удалось найти решение для дерева устройств, но я нашел достаточно фрагментов кода, чтобы приложение могло его прочитать. По сути, я просто настроил прерывание на GPIO и использовал clock_gettime
для измерения периода между фронтами. Это требует большой фильтрации, но я использую ее только для того, чтобы убедиться, что вентилятор работает, так что все в порядке.
read seq1
read seq2
printf '%s\n' "$seq1" "$seq2" |
sed -Ee '
N;H;p;z;x
:zip
# 1 2 3
s/\n(.)(.*\n)(.)/\1\3\n\2/
s/\n\n//; # zipping is complete when the two markers collide
t zip
:cmp
s/^([-+]*)(AT|TA|CG|GC)/\1+/;t cmp
s/[ATCG]{2}/-/;t cmp
'
Выход:
ATGCATGCTATC
TACGTTGCATTG
+++++---++-+
Другой подход, на этот раз с использованием утилиты awk , где мы сжимаем две последовательности символ за символом и с помощью ассоциативного массива h
, который предварительно -заполнен соответствующими ключами, чтобы дать + в то время как остальные получают-
awk '
BEGIN {
OFS = ORS
split("AT TA CG GC", a)
for (var in a) h[a[var]]
seq1 = ARGV[1]; seq2 = ARGV[2]
len = length(seq1)
while ( ++pos <= len ) {
s = substr(seq1, pos, 1) \
substr(seq2, pos, 1) ;
res = res ((s in h) ? "+" : "-")
}
print seq1, seq2, res
}
' "$seq1" "$seq2"
Мы используем python3 для сравнения последовательностей, хранящихся в строках и заархивированных
python3 -c 'import sys
s,t = sys.argv[1::]
dna = "ATCG"
d = {i+j: "+" for i,j in zip(dna[0::2],dna[1::2])}
print(*[d.get(x+y,d.get(y+x,"-")) for x,y in zip(s,t)],sep="")
' "$seq1" "$seq2"
Perl адаптация приведенного выше примера Python:
printf '%s\n' "$seq1" "$seq2" |
perl -F// -pale '
my @h = qw(A T C G);
my %h = (@h, reverse @h);
my $zip = join q(), map { $F[$a++], $_ } <> =~ /./g;
$_ = $zip =~ s/(.)(.)/qw(- +)[$2 eq $h{$1}]/reg;
'
Использование bash
иtr
:
#!/bin/bash
printf '%s\n%s\n' "$1" "$2"
tr 37124568 '++[-*]' <<<$(( $(tr ATCG 1234 <<<"$1 + $2") ))
Тестирование:
$ bash script ACCTACCATAG AGTACCCGATC
ACCTACCATAG
AGTACCCGATC
-+-+----+++
Скрипт заменяет символы в последовательностях, заданных в командной строке, цифрами таким образом, что при их сложении цифры 3 и 7 в сумме означают +
, а все остальные цифры означают -
.
Символ изменяется следующим образом:
A --> 1
T --> 2
C --> 3
G --> 4
Это означает, что A
+ T
— это то же самое, что 1+2, то есть 3. Точно так же 7 получается из 3+4 для C
и G
.
Внешний вызов tr
преобразует все 3 и 7 в +
и все другие возможные цифры в -
. Сумма вычисляется с помощью арифметического расширения $((... ))
, которое выполняет сложение двух чисел, полученных в результате внутреннего вызова tr
, который просто меняет буквы на цифры в двух последовательностях.
Проверка ввода не выполняется. Нет проверки на арифметические ошибки,подобно переполнению (, которое, вероятно, произойдет для последовательностей длиннее нескольких пар оснований, если вы не позаботитесь о том, чтобы разбить их, например. по характеру ).
Если вы хотите читать последовательности из стандартного ввода, используйте
#!/bin/bash
read s1
read s2
printf '%s\n%s\n' "$s1" "$s2"
tr 37124568 '++[-*]' <<<$(( $(tr ATCG 1234 <<<"$s1 + $s2") ))