我试图在几千行的文件中找到所有出现的字母串。然后我将计算每个字符串。下面的示例文件只包含两行,但该文件中的所有文本都是相同的结构(其中>
表示新行,字母串是搜索的位置。截至目前,我将整个文件返回为输出不仅仅是我要找的字符串。谢谢你:)。
文件
>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
(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
答案 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
这修复了包含在行结尾上的子序列。这与我真正想要的单线解决方案一样复杂
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
。