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

时间:2016-01-18 16:45:44

标签: perl

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

文件

>hg19_refGene_NM_000016 range=chr1:76190032-76229363 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GGGTTCGGGCGATGCTGCAGGgtgagagggagcccagcggtgcggtgggg

g {4}的理想输出

gggg

g {3}的理想输出

GGG
GGG
ggg
ggg

Perl我试过

4之间的{...}是要搜索的qw(G g)中的多少个

cat file.txt | perl -ne 'chomp; s/\s|\cJ|\cM//g; s/^\>/\n/ and $_.="\t";print' | perl -ne '$in=$_;grep $in=~m/$_{4}/i, qw(G g) and print' > test.txt

修改

>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

多输出(搜索输入和输出行)

>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
GGG

多输出我

  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

2 个答案:

答案 0 :(得分:2)

从表面上看,这很简单。这个单行代码会产生类似你想要的东西

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 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


更新2

这修复了包含在行结尾上的子序列。这与我真正想要的单线解决方案一样复杂

perl -076 -nE 'chomp; s/(.+)// && say qq{>$1}; s/\s//g; say $1 while /(g{3})/gi' test.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

答案 1 :(得分:1)

如果您自己使用一个perl进程(没有cat),则可以使用"嵌套while"用于从数据文件中读取一行的语句" while()"它是开放的,还有剩余的线要阅读,然后print线的匹配元素" while()"有一些东西匹配:

 perl -e 'use English; 
          while(<>) { print "$MATCH\n" while $_ =~ /g{3}/ig }'
          sequence.txt

$MATCH$&。我为了说明目的添加了use English ;-) ...)

修改

嵌套while()方法正是@ Borodin的回答,因为它使用-n开关,正如perldoc perlrun告诉我们的那样,包裹{{1}之后的语句与-E