Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grep(bash)多行模式_Bash_Unix_Grep_Multiline - Fatal编程技术网

grep(bash)多行模式

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

在bash(4.3.46(1))中,我有一些称为fasta的多行记录,其中每个记录都是由带有>name的行和以下行DNA序列([AGCTNacgtn])启动的,这里有三条记录:

>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