我有一个DNA序列文件“测试”,每个序列都带有标头或ID,如下所示:
>new
ATCGGC
>two
ACGGCTGGG
>tre
ACAACGGTAGCTACTATACGGTCGTATTTTTT
我想在匹配给定字符串之前和之后打印每个连续字符串的长度,例如 CGG
输出将如下所示:
>new
2 1
>two
1 5
>tre
4 11 11
或者可能只是每行匹配之前和之后的字符长度。
2 1
1 5
4 11 11
我的第一次尝试是使用sed在找到'>'之后打印下一行,然后找到了每个grep匹配“ CGG”的字节偏移量,我打算将其用于转换为长度,但这产生了以下内容:
sed -n '/>/ {n;p}' test | grep -aob "CGG"
2:CGG
8:CGG
21:CGG
35:CGG
本质上,grep会为每个匹配打印字节偏移量,然后递增计数,而我希望独立为每一行添加字节偏移量(即在每行之后重置)。
我想我也需要使用sed进行搜索,因为它逐行运行,但是我不确定如何计算给定字符串中的字节偏移量或字符。
任何帮助将非常感激。
通过使用给定的字符串作为awk中的字段分隔符,就像遍历每行中的字段并打印其长度一样简单。(以>
我们开头的行照原样打印。)
尽管您可能需要检查一些边缘情况,例如以CGG
,以,以CGG
,仅包含CGG
,等,这将为您的示例数据提供所需的输出。
$ awk -F CGG '/^>/ {print; next} {for (i=1; i<=NF; ++i) {printf "%s%s", length($i), (i==NF)?"\n":" "}}' file.txt
>new
2 1
>two
1 5
>tre
4 11 11
awk -F CGG
使用“ CGG”作为字段分隔符调用awk。这会将每一行解析为一组字段,这些字段由字符串“ CGG”的每次(如果有)出现分隔。“ CGG”字符串本身既不包含在任何字段中,也不包含在任何字段中。
因此,该线ACAACGGTAGCTACTATACGGTCGTATTTTTT
被解析成三个字段:ACAA
,TAGCTACTATA
,和TCGTATTTTTT
,通过在AWK程序表示$1
,$2
和$3
分别。
'/ ^> / {print; 下一个}
此模式/操作告诉awk,如果该行>
以打印该行开始并立即转到输入的下一行,则无需考虑awk程序中的任何其他模式或操作。
{for(i = 1; i <= NF; ++ i){printf“%s%s”,length($ i),(i == NF)?“ \ n”:“”}}
如果我们执行此操作,我们知道该行不是从开头开始的>
(请参见上文)。由于只有一个动作而没有任何模式,因此将为到达此处的每一行输入执行该动作。
for循环遍历所有字段(这NF
是一个特殊的awk变量,其中包含当前行中的字段数)并显示它们的长度。通过检查是否到达最后一个字段,我们知道是打印换行符还是仅打印空格。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句