检查文件中的字符数是否可以被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

相关内容