使用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的最佳方式