我正在嘗試檢查 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
使用bash
,GNU grep
和wc
,但沒有變數:
(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )
....它回傳一個真的只有當 DNA 字元是三的倍數時才退出代碼。
在程式碼中使用它可能看起來像:
if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then