我相信我需要使用grep,因为我正在搜索多个文件,并且我需要文件名显示为每一行的标题。我在macOS上使用终端。
所以说我在目录“ dir”中有一个文件file1,内容如下:
>species one; trnF(ggc)
GGCCC
AACGC
>species one; rrnS
TAGCA
GGCAC
在目录“ dir”中还有一个附加文件file2,内容如下
>species two; trnF(gga)
GGACG
CGACG
GCAC
>species two; rrnS
GCATG
GGCAG
我想得到以下输出:
dir/file1:>species one; trnF(ggc)
dir/file1-GGCCC
dir/file1-AACGC
--
dir/file2:>species two; trnF(gga)
dir/file2-GGACG
dir/file2-CGACG
dir/file2-GCAC
我可以使用-A在具有模式的行之后获得特定数量的行:
$ grep -A 2 'trnF' dir/file*
但是文件在grep命令之后有不同的行数,因此我得到以下信息:
dir/file1:>species one; trnF(ggc)
dir/file1-GGCCC
dir/file1-AACGC
--
dir/file2:>species two; trnF(gga)
dir/file2-GGACG
dir/file2-CGACG
如何获得所有内容,直到下一个'>'符号?
正如您所发现的,它grep -A
是不灵活的,因为它仅允许指定上下文的静态行数。
相反,这是一条awk
命令,用于检测选定序列何时发生,并将其输出,直到遇到另一个不符合条件的序列头为止:
awk -v name='trnF' -v OFS=':\t' '
FNR == 1 && NR > 1 { print "--" }
/^>/ { out=0 }
$0 ~ "^>.*" name { out=1 }
out == 1 { print FILENAME, $0 }' files
该-v name=something
选项将分配something
给代码中的name
变量awk
,并将用作与包含给定字符串的fasta标头行匹配的正则表达式的一部分。
最后一部分的输出awk
可能类似于
file: >species one; trnF(ggc)
file: GGCCC
file: AACGC
--
file1: >species one; trnF(ggc)
file1: GGCCC
file1: AACGC
--
(:
后面的制表符用作文件名和数据之间的分隔符,可以通过OFS
在命令行上将其设置为其他内容来更改-v OFS=somethingelse
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句