我有一个fasta格式的文件,如下例所示。我想从序列中提取文件的条目:“ CGTACG”出现多次。
>seq1
AAATTCCGTACGGGCCTCT
>seq2
TGGAATCACAGCGGCGTACGCAGCGGCGGCTGCGGCCGTACGGCG
>seq3
AATGCCAAACGTACGAACAT
在此示例中,输出为(因为序列'CGTACG'发生两次):
>seq2
TGGAATCACAGCGGCGTACGCAGCGGCGGCTGCGGCCGTACGGCG
您可以为此使用awk
:
for file in *; do
[[ -f "$file" ]] || continue # skip if not a regular file
if ! awk -v seq=CGTACG '$0 ~ seq".*"seq {exit(1)}' "$file"; then
# the file has two or more occurrences of the string on the same line, process it
# more code
fi
done
awk
在每个文件中查找字符串,并在找到具有两次或多次出现该字符串的行时立即退出1。 if !
测试可确保仅在awk
的退出代码为1时才拾取文件。
如果我们在不同行中查找多个匹配项,则:
for file in *; do
[[ -f "$file" ]] || continue # skip if not a regular file
if ! awk -v seq=CGTACG '$0 ~ seq {x++; if(x>1) exit(1)}' "$file"; then
# the file has two or more occurrences of the string on different lines, process it
# more code
fi
done
这是问题的扩展:how can I count the frequency of letters
awk -v subseq="CGTACG" '
/>/ && gsub(subseq,subseq,seq) > 1 { print name; print seq }
/>/{name=$0;seq="";next}
{seq=seq $0}
END { if(gsub(subseq,subseq,seq) > 1) { print name; print seq } }
' file.fasta
此方法将所有多行序列合并为一行,并检查subseq
是否出现多于一个。它使用gsub
函数执行此操作:
gsub(ere, repl[, in])
行为与sub
(请参阅下文)类似,不同之处在于它应替换$0
或in
自变量中指定的所有出现的正则表达式(如ed实用程序全局替换)。
sub(ere, repl[, in ])
将字符串repl
替换为扩展正则表达式ERE
的第一个实例,替换为并返回替换数目中的字符串。如果省略 in
,awk将使用当前记录($0
)代替。来源:Awk Posix Standard] >>
但是,可以稍微清理一下:
awk -v subseq="CGTACG" ' function count_subseq(seq,subseq, t) { t=seq;gsub(RS,RS,t) return gsub(subseq,subseq,t) } />/ && count_subseq(seq,subseq) > 1 { print name; print seq } />/{name=$0;seq="";next} {seq=seq RS $0} END { if(count_subseq(seq,subseq) > 1) { print name; print seq } } ' file.fasta
同样地,使用
bioawk
,您可以执行
BioAwk基于Brian Kernighan's awk中记录的"The AWK Programming Language", by Al Aho, Brian Kernighan, and Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X) 。我不确定此版本是否与POSIX兼容。bioawk -c fastx -v subseq="CGTACG" '(gsub(subseq,subseq,seq)>1){print ">"$name; print $seq}' file.fasta
注:
您需要的是: