我正在尝试检查 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