字符串匹配后提取fasta id

时间:2019-03-28 19:28:37

标签: perl grep

我有一个Fasta序列列表,如下所示:

>Product_1_001:299:H377WBGXB:1:11101 
TGATCATCTCACCTACTAATAGGACGATGACCCAGTGACGATGA
>Product_2_001:299:H377WBGXB:2:11101 
CATCGATGATCATTGATAAGGGGCCCATACCCATCAAAACCGTT

原始的fasta序列比此处发布的子集长得多。我想将模式“ TCAT”之后的10个字符提取到一个单独的文件中,然后执行

grep -oP "(?<=TCAT).{10}"

我确实得到了所需的结果,

CTCACCTACT
TGATAAGGGG

我希望将其对应的Fasta ID作为一列,将提取的模式作为第二列,如:

>Product_1_001:299:H377WBGXB:1:11101     CTCACCTACT
>Product_2_001:299:H377WBGXB:2:11101     TGATAAGGGG

2 个答案:

答案 0 :(得分:2)

尝试这种单线模式

perl -lne ' /^[^<].+?(?<=TCAT)(.{10})/ and print $p,"\t",$1; $p=$_ ' file

使用您给定的输入

$ cat fasta.txt
>Product_1_001:299:H377WBGXB:1:11101
TGATCATCTCACCTACTAATAGGACGATGACCCAGTGACGATGA
>Product_2_001:299:H377WBGXB:2:11101
CATCGATGATCATTGATAAGGGGCCCATACCCATCAAAACCGTT

$ perl -lne ' /^[^<].+?(?<=TCAT)(.{10})/ and print $p,"\t",$1; $p=$_ ' fasta.txt
>Product_1_001:299:H377WBGXB:1:11101    CTCACCTACT
>Product_2_001:299:H377WBGXB:2:11101    TGATAAGGGG

$

答案 1 :(得分:0)

另一种方式是使用awk这样的命令:

cat <your_file>| awk -F"_" '/Product/{printf "%s", $0; next} 1'|awk -F"TCAT" '{ print substr($1,1,35) "\t" substr($2,1,10)}'

输出:

Product_1_001:299:H377WBGXB:1:11101     CTCACCTACT
Product_2_001:299:H377WBGXB:2:11101     TGATAAGGGG

希望它能对您有所帮助。