匹配两个文件并过滤掉

匹配两个文件并过滤掉

我有两个文件

文件A

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT
>TCONS_00013830 gene=XLOC_006942
AAACACGGTTAGCTTGATATCACTGATGATCGATGGGATAGAGTCAGAGAACATCTTGTTCCTTAATTAT
CTCAATTCGTGAGATGTTGGACGATATCTCGATAGGGAGAGAAGGCGTTGTTCTGGATCATCACCGTGCT
CAGGGGTCAATTTTACACTGAGCAGGGGCAAAGACGTAAATTTTTACTTCCTTACTTGAGTAAGAGCAAG
TTTAATACTACAACCAACTACTACAAACTCCAATTCATTTATAACCAATCTAATAACTTATTCATACAAT
AGTTACCTATAAGCATATACTACACACACAACGTATTGGAATCCTCCGTGCTGCTGCTGGCTACAGATCT

文件B

XLOC_000030
XLOC_000059
XLOC_000210

FileA 是 FASTA 序列文件。以 开头的每一行>是一个序列名称,其下面的行是序列。我想提取 FileB 中提到的那些 ID 的序列。在这种情况下:

文件C

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT

我尝试了这个命令:

perl -pe 's/\n//; s/>(.*)/\n>$1\t/' A |grep -f <(awk '{print $1}' B) |sed 's/\t/\n/' | fold -w 60 > C

但它不起作用。

答案1

提示:使用数据库工具进行数据库工作。

如果您最终花费所有时间来研究查找内容的机制,而不是进行查找本身,并且您查找内容的命令是perl, sed, awk, 的长组合,并且grep开始类似于调制解调器线路噪声,那么是时候考虑了使用实际的数据库工具为您数据库而不是将定制查询拼凑在一起文本处理工具。

从RNA中选择*,其中基因位于('XLOC_000030','XLOC_000059','XLOC_000210');
使用起来更加简单。

也就是说,有一些文本处理调制解调器线路噪音。

不要重复工作。

您正在将数据库从每条记录多行的形式动态转换为每条记录一行的形式。执行一次,而不是每次查询。有一个Makefile这样说:

降A调:A
        sed -e '/^>/s/$$/ /;:a;$$!N;s/\n //;ta;s/^>//;P;D' $^ >[电子邮件受保护]
        MV[电子邮件受保护]$@

make然后每次A可能发生变化时运行即可。 (不要忘记这make依赖于这些行开头的空格作为一个TAB字符。)

sed程序是:

# 在记录的第一行添加一个空格。
/^>/s/$$/ /
:A
# 如果不是EOF则加入
$!N
# 如果连接行以空格开头,则消除换行符和空格。
s/\n //
# 如果是则循环。
# 消除记录字符的初始起始,因为那现在是换行符。
s/^>//
# 打印并从缓冲区中删除整个记录。然后重新开始。
D

查询

您的查询命令过于复杂,实际上只是

grep -f B A.flat > C.flat

将查询输出转换回多行记录会产生更多行噪声:

sed -e 's/^/>/' C.flat|fold -s -w70|sed -e 's/^[^>]/ /' > C

省略中间文件可以得出:

grep -f B A.flat|sed -e 's/^/>/'|fold -s -w70|sed -e 's/^[^>]/ /' > C

然后再次 …

重复一遍:实际的数据库工具会更好。如果您有大量记录,考虑到您(从这个问题和其他问题)似乎正在做的事情,那么使用文本处理工具方法进行搜索、插入和删除将非常低效。实际的数据库可能是gene字段上建立索引, 相比之下。

答案2

#!/bin/bash
while read line
do
        grep -A 1 $line filea >> filec
done < fileb

相关内容