如何解决如何使用awk在每个模式之后进行多次匹配并打印不同数量的行
我有一个包含数千行的大文件,看起来像:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00002235.4
TTACGCAT
TAGGCCAG
>ENST00005546.9
TTTATCGC
TTAGGGTAT
我想grep特定ID(在>
之后),例如ENST00001234.1
,然后想要在比赛之后获得行,直到下一个>
[不管行数是多少]。我想立即以这种方式grep约63个ID。
如果我grep ENST00001234.1
和ENST00005546.9
id,理想的输出应该是:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
我尝试了awk '/ENST00001234.1/ENST00005546.9/{print}'
,但没有帮助。
解决方法
您可以将>
设置为记录分隔符:
$ awk -F'\n' -v RS='>' -v ORS= '$1=="ENST00001234.1"{print RS $0}' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
-
-F'\n'
,以便更轻松地将搜索字词与第一行进行比较 -
-v RS='>'
设置>
作为输入记录分隔符 -
-v ORS=
清除输出记录分隔符,否则您将在输出中获得额外的换行符 -
$1=="ENST00001234.1"
将进行字符串比较并匹配整个第一行,否则您必须转义.
之类的正则表达式元字符并添加定位符 -
print RS $0
(如果找到匹配项),则打印>
和记录内容
如果要匹配多个搜索词,请将它们放在文件中:
$ cat f1
ENST00001234.1
ENST00005546.9
$ awk 'BEGIN{FS="\n"; ORS=""}
NR==FNR{a[$0]; next}
$1 in a{print RS $0}' f1 RS='>' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
此处,f1
的内容用于构建数组a
的键。读取第一个文件后,RS='>'
将更改第二个文件的记录分隔符。
$1 in a
将检查第一行是否与数组a
中的键匹配
EDIT(通用解决方案): 如果要在Input_file中查找多个字符串,然后在awk
变量{{1}中提及所有字符串},search
(逗号)分开,应打印所有匹配的(各行)。
,
如果要从另一个文件读取ID(需要在ID中搜索ID),请尝试以下操作。其中awk -v search="ENST00001234.1,ENST00002235.4" '
BEGIN{
num=split(search,arr,",")
for(i=1;i<=num;i++){
look[">"arr[i]]
}
}
/^>/{
if($0 in look){ found=1 }
else { found="" }
}
found
' Input_file
是具有所有ID的文件,而look_file
是实际的内容文件。
Input_file
用于单个文本搜索: 请尝试以下操作。使用GNU awk '
FNR==NR{
look[">"$0]
}
/^>/{
if($0 in look){ found=1 }
else { found="" }
}
found
' look_file Input_file
中显示的示例编写和测试。可以根据需要提供一个字符串,该字符串需要在变量awk
中进行搜索。
search
说明: 添加以上详细说明。
awk -v search="ENST00001234.1" '
/^>/{
if($0==">"search){ found=1 }
else { found="" }
}
found
' Input_file
,
没有必要重新发明轮子。有多种生物信息学工具可用于此任务(使用序列ID列表提取fasta
序列)。例如,seqtk subseq
:
以文件名.lst中的名称提取序列,每行一个序列名称:
seqtk subseq in.fq name.lst > out.fq
它也适用于fasta
文件。
使用conda install seqtk
或conda create --name seqtk seqtk
安装seqtk
软件包,该软件包具有其他有用的功能,而且速度很快。
另请参见:
Retrieve FASTA sequences using sequence ids
Extract fasta sequences from a file using a list in another file
How To Extract A Sequence From A Big (6Gb) Multifasta File?
extract sequences from multifasta file by ID in file using awk
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。