例如,我在名为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