檢查檔案中的字元數是否可以被3整除

檢查檔案中的字元數是否可以被3整除

我正在嘗試檢查 dna 文件中核苷酸鹼基字元的數量是否是 3 的倍數,並且在以下程式碼中不斷出現錯誤:

var4=$(wc -c < $1 | bc)
var5=$($var4 % 3)

if [ "$var5" -eq 0 ]; then

正如您所看到的,上面的程式碼並不完整,但我只是展示了我遇到問題的部分。

答案1

假設您的核苷酸是使用群組中的字母編碼的acgtn,以下命令將刪除該群組中不是字元的所有內容(例如換行符和空格等),然後計算剩餘的字元:

ncount=$( tr -d -c 'acgtn' <"$1" | wc -c )

然後,您可以透過簡單的測試來檢查這個數字,但請注意使用$((...))而不是$(...)

if [ "$(( ncount % 3 ))" -eq 0 ]; then
    echo 'nucleotide count is multiple of 3'
fi

如果您使用大寫字母或兩者的混合,請tr適當擴展使用的字串。

答案2

要刪除三個一組的所有非換行符,我們可以這樣做:

sed 's/...//g' file

如果結果僅為空行,則所有行都具有三個字元的倍數。

如果輸入不是一行且可能包含其他字元(包括換行符),則刪除任何不是核苷酸鹼基字元(假設為大寫ACGTN)的內容,包括換行符:

{ <file tr -cd 'ACGTN'; echo; } | sed 's/...//g'

如果結果為空(只有換行符),則基本字元數是 3 的倍數。

假設您想要在計數不是 3 的倍數時停止腳本(退出),請使用以下命令:

if [ "$( { <file tr -cd 'ACGTN'; echo; } | sed 's/...//g')" ]; then
    echo 'nucleotide count is not multiple of 3'
    exit 1
fi

答案3

一個sed選項

f=$(sed -E "s/[actgn]{3}//g" file); echo ${#f}

只需刪除所有連續的有效3 個鹼基組,如果末尾留下了除零長度字串之外的任何內容,那麼您就會遇到問題......儘管這將允許新行,前提是中斷是3 個鹼基的倍數。

答案4

使用bashGNU grepwc,但沒有變數:

(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )

....它回傳一個真的只有當 DNA 字元是三的倍數時才退出代碼。

在程式碼中使用它可能看起來像:

if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then

相關內容