grep(bash)多行模式
在bash(4.3.46(1))中,我有一些称为fasta的多行记录,其中每个记录都是由带有>name的行和以下行DNA序列([AGCTNacgtn])启动的,这里有三条记录:grep(bash)多行模式,bash,unix,grep,multiline,Bash,Unix,Grep,Multiline,在bash(4.3.46(1))中,我有一些称为fasta的多行记录,其中每个记录都是由带有>name的行和以下行DNA序列([AGCTNacgtn])启动的,这里有三条记录: >chr1 AGCTACTTTT AGGGNGGTNN >chr2 TTGNACACCC TGGGGGAGTA >chr3 TGACGTGGGT TCGGGTTTTT 如何使用bash grep获取第二条记录?在其他语言中,可以使用: >chr2\n([AGCTNagctn]*\n)* 在Ba
>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT
如何使用bash grep获取第二条记录?在其他语言中,可以使用:
>chr2\n([AGCTNagctn]*\n)*
在Bash中,我试图使用来自(以及其他SOs)的想法。这不起作用:
grep -zo '>chr2[AGCTNacgtn]+' file
结果应该是:
>chr2
TTGNACACCC
TGGGGGAGTA
解决方案
在我的系统上,这就是解决方案(下面几乎是Cyrus's,即没有第二个grep.
)的管道:
您可以将
awk
与自定义RS
一起使用:
awk -v n=2 -v RS='(^|\n)>' 'NR==n+1{print ">" $0}' file
>chr2
TTGNACACCC
TGGGGGAGTA
使用GNU grep:
grep -Pzo '>chr2\n[AGCTNacgtn\n]+' file | grep .
输出:
>chr2
TTGNACACCC
TGGGGGAGTA
>chr2
TTGNACACCC
TGGGAGTA
您应该安装perl包。它包含许多可从shell直接使用的实用程序,用于处理fasta
文件,如或(和)
安装后,它的简单操作如下:
fashead -n2 fastafile | fastail -n1
输出
>chr2
TTGNA.....
甚至更简单
fasgrep chr2 fastafile
使用相同的输出…尝试以下操作-
grep 'chr2' -A 2 file
>chr2
TTGNACACCC
TGGGGGAGTA
处理多行记录的最佳工具是
awk
就你而言:
awk 'BEGIN{RS=">"} NR==2 {print RS$0}' input.txt
输入文件
说明:
开始{RS=“>”}
最初将记录分隔符设置为“>”
NR==2
仅对记录进行筛选#2
{print RS$0}
print record#2,返回缺少的记录分隔符创建了sedgrep混合版本,以通用方式支持。。。
您可以使用此sedgrepshell命令,该命令位于
直接链接:
对于您的情况,直接命令是
cat <FILE_NAME> | sed -nr ':main; /^>.*chr2/ { :loop; p; n; /^>/ b main; b loop} '
哦,我想-z使
\n
没有必要?只有grep-Pzo'>chr2\n[AGCTNacgtn\n]+'文件
工作-最后的grep。
我的系统说“二进制文件(标准输入)匹配”不管这意味着什么。我得到了>chr2(\n[^>-\n]+')+'>没有新的结尾line@user3375672:好的。我把答案退回到以前的版本。@silel:这可能取决于grep的版本。我使用了2.6.3版。
>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT
cat <FILE_NAME> | sed -nr ':main; /^>.*chr2/ { :loop; p; n; /^>/ b main; b loop} '
Default NEW_LINE_PATTERN is ^\[
Usage :
cat {INPUT_FILE_NAME} | sedgrep {NEW_LINE_PATTERN} {THREAD_OR_SEARCH_PATTERN}
cat {INPUT_FILE_NAME} | sedgrep {THREAD_OR_SEARCH_PATTERN}
sedgrep {NEW_LINE_PATTERN} {THREAD_OR_SEARCH_PATTERN} {INPUT_FILE_NAME}
sedgrep {THREAD_OR_SEARCH_PATTERN} {INPUT_FILE_NAME}
Example :
cat sampleInput.log | sedgrep 2016-05-23 DB_CONN
cat sampleInput.log | sedgrep DB_CONN
sedgrep 2016-05-23 DB_CONN sampleInput.log
sedgrep DB_CONN sampleInput.log