In bash (4.3.46(1(( 我有一些多行所谓的fasta记录,其中每条记录都是由>name和以下行DNA序列([AGCTNacgtn](在线启动的,这里有三条记录:
>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT
如何使用 bash grep 获得第二条记录?在其他语言中,可以使用:
>chr2n([AGCTNagctn]*n)*
在 Bash 中,我试图使用这里的想法(以及其他 SO(。这不起作用:
grep -zo '>chr2[AGCTNacgtn]+' file
结果应为:
>chr2
TTGNACACCC
TGGGGGAGTA
溶液
在我的系统上,这是解决方案(几乎是赛勒斯的下面,即没有管道到第二个grep .
(:
grep -Pzo '>chr1n[AGCTNacgtnn]+' file
使用 GNU grep:
grep -Pzo '>chr2n[AGCTNacgtnn]+' file | grep .
输出:
>CHR2TTGNACACCCTGGGGGAGTA
您可以将awk
与自定义RS
一起使用:
awk -v n=2 -v RS='(^|n)>' 'NR==n+1{print ">" $0}' file
>chr2
TTGNACACCC
TGGGGGAGTA
你应该安装 FAST perl 软件包。它包含许多可从shell直接用于处理fasta
文件的实用程序,如fashead或fastail(以及更多(
安装后很简单:
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
输入.txt
>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT
解释:
BEGIN{RS=">"}
最初将记录分隔符设置为">"
NR==2
仅针对记录 #2 的筛选器
{print RS$0}
打印带有缺失记录分隔符的记录 #2
创建了 sedgrep 混合版本以通用方式支持...您可以使用此 sedgrep shell 命令,该命令可在https://github.com/iamdvr/sedgrep-shell-util
直接链接:https://github.com/iamdvr/sedgrep-shell-util/blob/main/sedgrep
对于您的情况,直接命令是这个...
cat <FILE_NAME> | sed -nr ':main; /^>.*chr2/ { :loop; p; n; /^>/ b main; b loop} '
sedgrep 用法如下...
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