我有一个文件中的id列表和一个数据文件(大小约为3.2Gb),我想提取数据文件中包含id和下一行的行.我做了以下事情:
grep -A1 -Ff file.ids file.data | grep -v "^-" > output.data
Run Code Online (Sandbox Code Playgroud)
这有效,但也提取了不需要的子串,例如,如果id EA4也被拉出线EA40.
所以我尝试使用相同的命令,但将-w(--word-regexp)标志添加到第一个grep以匹配整个单词.但是,我发现我的命令现在运行了> 1小时(而不是~26秒),并且还开始使用10千兆字节的内存,所以我不得不杀死这份工作.
为什么添加-w使命令如此缓慢和内存占用?如何有效地运行此命令以获得所需的输出?谢谢
file.ids 看起来像这样:
>EA4
>EA9
Run Code Online (Sandbox Code Playgroud)
file.data 看起来像这样:
>EA4 text
data
>E40 blah
more_data
>EA9 text_again
data_here
Run Code Online (Sandbox Code Playgroud)
output.data 看起来像这样:
>EA4 text
data
>EA9 text_again
data_here
Run Code Online (Sandbox Code Playgroud) 我经常需要在fasta文件中找到一个特定的序列并打印出来.对于那些不知道的人,fasta是生物序列(DNA,蛋白质等)的文本文件格式.这很简单,你有一行序列名称后跟一个'>'然后跟随所有行,直到下一个'>'是序列本身.例如:
>sequence1
ACTGACTGACTGACTG
>sequence2
ACTGACTGACTGACTG
ACTGACTGACTGACTG
>sequence3
ACTGACTGACTGACTG
Run Code Online (Sandbox Code Playgroud)
我目前获得我需要的序列的方式是使用grep和-A,所以我会这样做
grep -A 10 sequence_name filename.fa
Run Code Online (Sandbox Code Playgroud)
如果我没有看到文件中下一个序列的开始,我会将10改为20并重复,直到我确定我得到了整个序列.
似乎应该有更好的方法来做到这一点.例如,我可以要求它打印到下一个'>'字符吗?
我有一个包含数千行的大文件,如下所示:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00002235.4
TTACGCAT
TAGGCCAG
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)
>例如,我想 grep 特定的 id(在符号之后),ENST00001234.1然后想在匹配之后获取行直到下一个>[不管行数]。我想以这种方式一次 grep 大约 63 个 ID。
如果我 grepENST00001234.1和ENST00005546.9ids,理想的输出应该是:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)
我试过了,awk '/ENST00001234.1/ENST00005546.9/{print}'但没有帮助。