需要查找文本/序列文件中字符的位置?

需要查找文本/序列文件中字符的位置?

例如,我在名为sequence_test的文本文件中有以下序列: AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG

我想找到所有“A”字符的位置号并将其作为输出返回。我应该使用什么命令来做到这一点?

答案1

$ fold -w 1 file | sed -n '/A/='
1
2
3
4
5
8
11
16
19
20
21
28
30
34
36
39
41
47
49
51
53
56
59
62
64
67
69
71
73

这用于fold将输入的每个字符转换file为自己的行,然后sed用于输出每行的行号A

sed命令可以替换为任意数量的其他命令,例如awk '/A/ { print NR }'.

显然,专门使用awk也是可能的。以下用于substr()依次提取每个字符并输出该字符的位置(如果它是 )A

awk '{ for (i = 1; i <= length; ++i) if (substr($0,i,1) == "A") print i }' file

如果您想要以逗号分隔的列表中的所有数字,请将上述结果传递给paste -s -d, -.

答案2

使用(以前称为 Perl_6)

~$ raku -ne '.from.put for m:g/A/;' file

如果您只有一个单行文件,则可以使用上面的简单代码。该.from调用告诉您匹配从哪里开始(零索引)。或者,您可以使用.to返回比赛结束的位置。无论哪种方式,位置都会被返回,每行一个。

如果您有一个多行文件,您会想知道匹配字符的位置每行。下面的代码创建了一个哈希数组,它的作用就是:

~$ raku -ne 'state %a; state $i; $i++; for m:g/A/ { %a.push: $i => $_.from }; END .say for %a.sort;'   file

样本输入(OP 的示例核苷酸序列,两次,中间有一个空行):

AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG

AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG

示例输出:

1 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]
3 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]

通常,.say在 Raku 中用于提供人类可读的输出;但建议用于.put生产,因为.say会截断长序列(超过 99 个元素)。

上面的注释:要仅返回各行(假设是第一行)的结果,请将上面的代码更改END .say for %a.sort 为仅调用该<1>键(从而返回关联的值),如下所示:END .put for %a<1>;

示例输出(使用END .put for %a<1>;):

0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72

https://raku.org

相关内容