Überprüfen, ob die Anzahl der Zeichen in der Datei durch 3 teilbar ist

Überprüfen, ob die Anzahl der Zeichen in der Datei durch 3 teilbar ist

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 sedOption

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 grepund 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

verwandte Informationen