Quero criar um script bash que receba um arquivo de DNA e verifique se ele não possui caracteres de nova linha ou espaços em branco e, em seguida, produza os códons exclusivos junto com a contagem do número de vezes que eles ocorrem. Usei o código a seguir, mas o códon continua me dando uma saída de "bash-3.2$". Estou muito confuso se minha sintaxe está errada e por que não estou obtendo a saída adequada.
! /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
Por exemplo, se um arquivo chamado dnafile contiver o padrão aacacgaactttaacacg, o script receberá a seguinte entrada e saída
$script dnafile
aac 3
acg 2
ttt 1
Responder1
Você obtém essa saída porque a primeira linha do seu script inicia um novo bash
shell.
Essa linha deveria ser lida
#!/bin/bash
(observe o #
no início).
Você então mistura awk
sintaxe com código shell de uma maneira que nunca funcionará.
Em vez disso, mantenha a simplicidade e divida seu arquivo em grupos de três caracteres, classifique-os e conte quantos caracteres exclusivos você obtém:
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
Isso funcionaria desde que a entrada sempre contivesse um múltiplo de três caracteres, sem espaços incorporados ou outros caracteres.
Responder2
(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
}'
Responder3
awk
Uma versão um pouco mais prolixa
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*
Para esta entrada
arquivo1: OK
aacacgaactttaacacg
arquivo2: espaço
aacacgaact ttaacacg
arquivo3: quebra de linha
aacacgaact
ttaacacg
file4: não é um múltiplo de 3 bases
aacacgaactttaacac
Você consegue
file1
aac 3
ttt 1
acg 2
file2
is broken
file3
is broken
file4
is broken
Se você deseja apenas reparar os arquivos e não tem nenhum como, file4
então cat
seus arquivos passam tr
de uma ponta awk
ou de outra, assim como no seu exemplo
<<< $(cat file[1..3] | tr -d "\n ")