我有大量拥有数百万行的文件。然后我有一个名为contaminant_list的两列文件。对于我需要获取所有模式的出现次数的每个文件,始终使用左侧的模式名称和右侧的出现次数。
这个命令工作得很好:
while read line; do name=$(echo $line | cut -f1 -d' '); seq=$(echo $line | cut -f2 -d' '); echo -n $(date) $name "looking for $seq" >>adapt_contamination_log; egrep $seq $name_of_file | wc -l >>adapt_contamination_log; done <contaminant_list.txt;
和收益率:
Thu Sep 19 23:04:38 EDT 2013 >PrefixAdapter4/1 looking for GATCGGAAGAGCACACGTCTGAACTCCAGTCACTGACCAATCTCGTATGCCGTCTTCTGCTTG 0
Thu Sep 19 23:05:55 EDT 2013 >PrefixAdapter4/2 looking for CAAGCAGAAGACGGCATACGAGATTGGTCAGTGACTGGAGTTCAGACGTGTGCTCTTCCGATC 0
Thu Sep 19 23:07:09 EDT 2013 >PrefixAdapter16/1 looking for GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCGTCCCGATCTCGTATGCCGTCTTCTGCTTG 2611
..等等(我匹配的模式数量非常大) 重要的是模式GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCGTCCCGATCTCGTATGCCGTCTTCTGCTTG在我的大文件中是2611次。
但是,它很慢。有没有办法同时匹配所有模式,以便只能读取一次文件?
以下是contaminant_list.txt的样子:
TruSeqAdapter,Index12 GATCGGAAGAGCACACGTCTGAACTCCAGTCACCTTGTAATCTCGTATGCCGTCTTCTGCTTG
IlluminaRNARTPrimer GCCTTGGCACCCGAGAATTCCA
IlluminaRNAPCRPrimer AATGATACGGCGACCACCGAGATCTACACGTTCAGAGTTCTACAGTCCGA
RNAPCRPrimer,Index1 CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA
RNAPCRPrimer,Index2 CAAGCAGAAGACGGCATACGAGATACATCGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA
RNAPCRPrimer,Index3 CAAGCAGAAGACGGCATACGAGATGCCTAAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA
我正在考虑使用hash编写perl脚本,但是 - 我的经验是内置的bash解决方案总能更好地工作。你有什么想法吗?
感谢。