使用Perl在多行中查找特定文本

使用Perl在多行中查找特定文本,perl,Perl,我试图在一个几千行的文件中找到所有出现的一串字母。然后我要数一数每一根弦。下面的示例文件仅包含两行,但该文件中的所有文本都是相同的结构(其中表示新行,字母字符串是搜索的位置。到目前为止,我将整个文件作为输出返回,而不仅仅是我要查找的字符串。谢谢:) 文件 >hg19_refGene_NM_000016范围=chr1:76190032-76229363 5'pad=0 3'pad=0链=+repeatMasking=无 GGGTTCGGGCGATGCTGCAGGGTGAGGGAGCCAGCGTGC

我试图在一个几千行的文件中找到所有出现的一串字母。然后我要数一数每一根弦。下面的示例文件仅包含两行,但该文件中的所有文本都是相同的结构(其中
表示新行,字母字符串是搜索的位置。到目前为止,我将整个文件作为输出返回,而不仅仅是我要查找的字符串。谢谢:)

文件

>hg19_refGene_NM_000016范围=chr1:76190032-76229363 5'pad=0 3'pad=0链=+repeatMasking=无
GGGTTCGGGCGATGCTGCAGGGTGAGGGAGCCAGCGTGCGGTGGGG
g{4}的所需输出

gggg
g{3}的所需输出

GGG
GGG
ggg
ggg
我试过了 (在
{…}
之间的
4
是要搜索的
qw(G)
中的多少个)

编辑

>hg19_refGene_NM_000016 range=chr1:76190032-76229363 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GGGTTCGGGCGATGCTGCAGGgtgagagggagcccagcggtgcggtgggg
>hg19_refGene_NM_001282675 range=chr11:35453376-35551848 5'pad=0 3'pad=0 strand=- repeatMasking=none
TTCATTAGGGCTGGAGACTTCCATGAAGGGGCCAGTTACAGCAGGCTCCA
  perl -076 -nE 'chomp; s/(.+)// && say qq{>$1}; s/\s//g; say $1 while /(g{3})/gi' 4G.txt

 >hg19_refGene_NM_000016 range=chr1:76190032-76229363 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GGG
GGG
GGg
ggg
ggg
>hg19_refGene_NM_001282675 range=chr11:35453376-35551848 5'pad=0 3'pad=0 strand=- repeatMasking=none
GGG
GGG
多输出(搜索所在的行和输出)

我得到多个输出

>hg19_refGene_NM_000016 range=chr1:76190032-76229363 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GGGTTCGGGCGATGCTGCAGGgtgagagggagcccagcggtgcggtgggg
>hg19_refGene_NM_001282675 range=chr11:35453376-35551848 5'pad=0 3'pad=0 strand=- repeatMasking=none
TTCATTAGGGCTGGAGACTTCCATGAAGGGGCCAGTTACAGCAGGCTCCA
  perl -076 -nE 'chomp; s/(.+)// && say qq{>$1}; s/\s//g; say $1 while /(g{3})/gi' 4G.txt

 >hg19_refGene_NM_000016 range=chr1:76190032-76229363 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GGG
GGG
GGg
ggg
ggg
>hg19_refGene_NM_001282675 range=chr11:35453376-35551848 5'pad=0 3'pad=0 strand=- repeatMasking=none
GGG
GGG

表面上看,这很简单。这一行产生的东西就像你说的你想要的

perl -nE'/^>/ or say $1 while /(g{3})/ig' test.txt
输出
GGG
GGG
GGg
ggg
ggg
但是,正如我在评论中所说的,现在还不清楚
GGg
是否算数,你也不知道当文件中有多个序列时会发生什么



更新 这将解决修改后的问题

perl -nE'/^>/ and print or do { say $1 while /(g{3})/ig}' test.txt
输出
>hg19_refGene_NM_000016范围=chr1:76190032-76229363 5'pad=0 3'pad=0链=+repeatMasking=无
GGG
GGG
GGg
ggg
ggg
>hg19_refGene_NM_001282675范围=chr11:35453376-35551848 5'pad=0 3'pad=0链=-重复屏蔽=无
GGG
GGG


更新2 这将修复包裹线端点的子序列。这和我想要的单线解决方案一样复杂

perl -076 -nE 'chomp; s/(.+)// && say qq{>$1}; s/\s//g; say $1 while /(g{3})/gi' test.txt
输出
>hg19_refGene_NM_000016范围=chr1:76190032-76229363 5'pad=0 3'pad=0链=+repeatMasking=无
GGG
GGG
GGg
ggg
ggg
>hg19_refGene_NM_001282675范围=chr11:35453376-35551848 5'pad=0 3'pad=0链=-重复屏蔽=无
GGG
GGG

如果您单独使用一个
perl
进程(没有
cat
),您可以使用“嵌套
while
”语句从数据文件“
while()
”中读取一行,该文件已打开,还有行要读取,然后
打印该行的匹配元素“
while()
”有一些东西与之匹配:

 perl -e 'use English; 
          while(<>) { print "$MATCH\n" while $_ =~ /g{3}/ig }'
          sequence.txt
perl-e'使用英语;
while(){print“$MATCH\n”while${=~/g{3}/ig}'
sequence.txt
$MATCH
$&
。我添加了
使用英语
进行说明;-)…)


编辑:


<嵌套<代码> WHORY(/>)/Case>方法正是@鲍罗丁的答案,因为它使用了<代码> -n>代码>开关,它告诉我们,在代码< >代码> >代码> >(){} /代码>。< /P>中有一个<代码> GGG在您的示例序列中。这不算数吗?当文件中有多个序列时,您想要什么输出?我添加了对多行的编辑,甚至没有看到GGg,但是是的,您是正确的,它确实有效。电脑犯的错误比我少:)。。。谢谢:)。编辑多个条目有帮助吗?谢谢:)。好的,我已经修好了。(除了第二项中只有两个
ggg
子序列,而不是您所说的三个子序列)另一个问题是,如果子序列在文件中被拆分为多行,是否需要对其进行计数?目前,如果文件包含类似于
“xxxgg\ngxxxx\n”这样的行,则无法找到
ggg
我已经发布了从命令获得的输出,并且在计数中使用了yes子序列,如您所示。谢谢:)。@Chris:对不起,我忘了转换成Linux命令行语法。我已经更新了
使用英语
在一行中有点疯狂!:-D同意。。。把它放在那里,以防1美元不清楚。。。我没有看到使用
$1
。。。我经常使用shell中的perl命令,在使用
-E
-n
时,这些命令实际上与“一行程序”不同。我必须说我不知道我为什么要那样做。。。TIMTOWDI可能:-你知道
$MATCH
$和
是一样的,对吗?这可不是一块钱!修复了它,但我想
$&
不是perls<5.20的最佳方式