我有一个fasta文件,即test.fasta、pas.fasta、cel.fasta,如下图
test.fasta
>tile
ATGTC
>259
TGAT
pas.fasta
>ta
ATGCT
cel.fasta
>787
TGTAG
>yog
TGTAT
>In
NNTAG
我需要打印文件名和fasta序列的总数,如下所示,
test,2
pas,1
cel,3
我使用了以下命令,但未能达到我的目的
grep ">" test.fasta | wc -l && ls test.fasta
请帮我做同样的事情。
提前致谢。
这就是(to ount)
-c
选项的用途:grep
c
请注意,如果只有一个匹配的文件,则不会打印文件名。一些
grep
实现可以-H
选择强制始终打印文件名:要获得确切的预期输出,您只需替换
.fasta:
为,
:(这里假设您的文件名不包含其他出现,
.fasta:
例如my.fasta:foo.fasta
;当然,如果输出是 CSV 格式,文件名中的换行符或,
或字符以及可能的空白字符也是一个问题)"
使用 GNU awk
ENDFILE
和gensub()
:无论是 1 个还是多个输入文件(只要它小于 shell args 限制)以及文件名中存在哪些字符,只要不存在
=
(当 awk 在某些情况下可以,将其视为变量赋值 - 如果发生这种情况,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Other-Arguments了解如何处理它)。您可以对任何 awk 执行相同操作:
使用 Raku(以前称为 Perl_6)
样本输入(密码):
样本输出:
此解决方案使用 Perl 编程语言家族的成员 Raku。上面的代码依赖于 Raku
dir()
和grep()
例程,因此在经典 shell 介导的文件通配不存在或受到限制的平台上可能很有用(请参阅此处的 SO 讨论)。简而言之,
raku
使用选项调用-e
,它告诉 Raku 的编译器 (Rakudo) 编译和执行给定的单行程序。使用关键字调用该dir()
方法,该for
关键字告诉 Raku 循环使用过滤器获得的文件名值test => / \.fasta $/
。这样找到的文件名被单独加载到$fh
变量中并在一个{…}
块中进行分析。在块内部,从右到左读取,
lines
从文件句柄变量中提取,该$fh
变量自动加载到$_
主题变量中。这些行(现在保存在 内$_
)被grep
-ped 通过以查找带有^^
start-of-line 的行>
,表示新fasta
序列的开始。这样找到的行使用 进行计数elems
,并且$fh
和 count用逗号join
-ed 并使用 逐行返回。,
put
OP 最初要求返回“文件名”,因此从技术上讲,上面的代码就足够了。然而,因为
$fh
是IO::Path
对象,所以删除扩展很容易.fasta
:只需附加extension
例程$fh
以识别.fasta
扩展,并将其替换为空(""
):https://docs.raku.org/routine/dir
https://docs.raku.org/routine/grep
https://docs.raku.org/routine/extension
https://raku.org