Ich versuche zu prüfen, ob die Anzahl der Nukleotidbasenzeichen in meiner DNA-Datei ein Vielfaches von 3 ist und erhalte ständig den folgenden Code, der einen Fehler ausgibt:
var4=$(wc -c < $1 | bc)
var5=$($var4 % 3)
if [ "$var5" -eq 0 ]; then
Wie Sie sehen, ist der obige Code nicht vollständig, aber ich zeige nur den Teil, bei dem ich ein Problem habe.
Antwort1
Vorausgesetzt, Ihre Nukleotide sind mit den Buchstaben in der Gruppe codiert acgtn
, löscht der folgende Befehl alles, was kein Zeichen aus dieser Gruppe ist (z. B. Zeilenumbrüche und Leerzeichen usw.) und zählt dann die verbleibenden Zeichen:
ncount=$( tr -d -c 'acgtn' <"$1" | wc -c )
Sie können diese Zahl dann mit einem einfachen Test überprüfen, achten Sie jedoch auf die Verwendung von $((...))
anstelle von $(...)
:
if [ "$(( ncount % 3 ))" -eq 0 ]; then
echo 'nucleotide count is multiple of 3'
fi
Wenn Sie Großbuchstaben oder eine Mischung aus beiden verwenden, erweitern Sie die verwendete Zeichenfolge entsprechend tr
.
Antwort2
Um alle Zeichen, die keine Zeilenumbrüche sind, in Dreiergruppen zu entfernen, haben wir folgende Möglichkeiten:
sed 's/...//g' file
Wenn das Ergebnis nur leere Zeilen sind, enthalten alle Zeilen ein Vielfaches von drei Zeichen.
Wenn die Eingabe nicht aus einer Zeile besteht und andere Zeichen (einschließlich Zeilenumbrüche) enthalten kann, entfernen Sie alles, was keine Zeichen auf Nukleotidbasis sind (Großbuchstaben vorausgesetzt ACGTN
), einschließlich der Zeilenumbrüche:
{ <file tr -cd 'ACGTN'; echo; } | sed 's/...//g'
Wenn das Ergebnis leer ist (nur eine neue Zeile), ist die Anzahl der Basiszeichen ein Vielfaches von 3.
Angenommen, Sie möchten das Skript stoppen (beenden), wenn die Anzahl kein Vielfaches von 3 ist, verwenden Sie Folgendes:
if [ "$( { <file tr -cd 'ACGTN'; echo; } | sed 's/...//g')" ]; then
echo 'nucleotide count is not multiple of 3'
exit 1
fi
Antwort3
Eine sed
Option
f=$(sed -E "s/[actgn]{3}//g" file); echo ${#f}
Löschen Sie einfach alle zusammenhängenden gültigen Gruppen von 3 Basen. Wenn am Ende etwas anderes als eine Zeichenfolge mit der Länge Null übrig bleibt, haben Sie ein Problem … obwohl dadurch neue Zeilen zugelassen werden, sofern der Zeilenumbruch ein Vielfaches von 3 Basen beträgt.
Antwort4
Verwenden von bash
,GNU grep
und wc
, aber keine Variablen:
(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )
...was zurückgibt einWAHRExitcode nur, wenn die DNA-Zeichen ein Vielfaches von drei sind.
Die Verwendung im Code könnte folgendermaßen aussehen:
if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then