Я хочу создать скрипт bash, который берет файл dna и проверяет, что в нем нет символов новой строки или пробелов, а затем выводит уникальные кодоны вместе с их количеством раз, когда они встречаются. Я использовал следующий код, но кодон продолжает выдавать мне вывод "bash-3.2$". Я так запутался, неверный ли у меня синтаксис и почему я не получаю правильный вывод.
! /bin/bash
for (( pos=1; pos < length - 1; ++pos )); do
codon = substr($1, $pos, 3)
tr-d '\n' $1 | awk -f '{print $codon}' | sort | uniq -c
done
Например, если файл с именем dnafile содержит шаблон aacacgaactttaacacg, то скрипт будет принимать следующие входные и выходные данные:
$script dnafile
aac 3
acg 2
ttt 1
решение1
Вы получаете этот вывод, потому что первая строка вашего скрипта запускает новую bash
оболочку.
Эту строку следует читать так:
#!/bin/bash
(обратите внимание на #
в начале).
Затем вы смешиваете awk
синтаксис с кодом оболочки таким образом, что это никогда не будет работать.
Вместо этого не усложняйте задачу и разбейте свой файл на группы по три символа, отсортируйте их и посчитайте, сколько уникальных символов вы получили:
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
Это будет работать до тех пор, пока входные данные всегда содержат символы, кратные трем, без пробелов и других символов.
решение2
(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
perl -ne '# Split input into triplets (A3)
# use each triplet as key in the hash table count
# and increase the value for the key
map { $count{$_}++ } unpack("(A3)*",$_);
# When we are at the end of the file
END{
# Remove the key "" (which is wrong)
delete $count{""};
# For each key: Print key, count
print map { "$_ $count{$_}\n" } keys %count
}'
решение3
Немного более длинная awk
версия
awk 'BEGINFILE{print FILENAME; delete codon}
ENDFILE {
if (NR!=1 || NF!=1 || length($0)%3!=0){
print "is broken"}
else{
for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++};
for (c in codon) print c, codon[c];
print ""}' file*
Для этого входа
файл1: ОК
aacacgaactttaacacg
файл2: пространство
aacacgaact ttaacacg
файл3: перенос строки
aacacgaact
ttaacacg
file4: не кратно 3 основаниям
aacacgaactttaacac
Вы получаете
file1
aac 3
ttt 1
acg 2
file2
is broken
file3
is broken
file4
is broken
Если вы просто хотите восстановить файлы и у вас ничего не получается, file4
то cat
ваши файлы проходят tr
с одного конца awk
или с другого, как в вашем примере
<<< $(cat file[1..3] | tr -d "\n ")