在for循环中使用grep从文件中提取行,导出到文件名中具有变量的新文件



我正在尝试使用for循环从包含字符串的文件中提取所有行,该文件包含可能的字符串列表。我还想将grep的结果导出到一个新文件中,文件名中包含变量。

这是我所拥有的:

file="variables.txt"
listofvariables=$(cat ${file})
for variable in ${listofvariables}
do
samtools view sample.bam | 
grep "'${variable}'" 
> sample.${variable}.bam
done

这段代码所做的只是为每个变量创建一个空白文件。为什么grep不提取包含该变量的行并将其放入这些文件中?

作为参考,以下是variables.txt文件的样子:

mmu-let-7g-5p
mmu-let-7g-3p
mmu-let-7i-5p
mmu-let-7i-3p
mmu-miR-1a-1-5p
mmu-miR-1a-3p
mmu-miR-15b-5p
mmu-miR-15b-3p
mmu-miR-23b-5p
mmu-miR-23b-3p

下面是samtools view输出的样子:

7238520-1_CATAAT.mmu-miR-125b-5p    0   chr1    11301523    60  75M *   0   0CAGGTGTTTTCTCAGGCATTTGGATTTCTATAGAATCATAGTATTAAAATTTCAAAGTAATAACATTGCTTTTTA    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII AS:i:0  XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:75 YT:Z:UU NH:i:1
1422982-2_CCCCGC.mmu-miR-132-3p 0   chr1    11301726    60  97M *   0   0   AAGTCTGTTTTTATGTGAGTGTTCCTGTGAAACTGAGGTCTGATGACTCTTCCTTAAGCAATTACAACTTCATTAGCATACATAAGGTTCAATTAAA   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII   AS:i:0  XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:97 YT:Z:UU NH:i:1
5675450-1_CCCCGC.mmu-miR-132-3p 0   chr1    11301726    60  97M *   0   0   AAGTCTGTTTTTATGTGAGTGTTCGTGTGAAACTGAGGTCTGATGACTCTTCCTTAAGCAATTACAACTTC^C

对于那些可能不熟悉samtools view的人来说,只需读出.bam文件即可。你可以把它想象成cat

提前感谢!

由于。。。

此代码所做的只是为每个变量创建一个空白文件。

。。。您知道您的变量文件被正确读取,并且您的for循环正在正确地迭代结果。结果文件为空表示grep找不到任何与您的模式匹配的文件。

为什么不呢?因为grep命令中的模式。。。

grep "'${variable}'" 

。。。并不意味着你认为它意味着什么。您已经花了一些精力将字面上的撇号(')添加到模式中,但在这种情况下这些撇号没有特殊意义。您的模式不匹配任何行,因为在数据中,目标字符串的外观周围没有撇号。

这会更好:

grep -F -e "${variable}" 

-F选项告诉grep将模式视为要匹配的固定字符串,这样内的任何内容都不会被解释为regex元字符。-e确保模式被这样解释,即使例如它以-字符开头。双引号保留了下来,因为它们是确保shell不会对扩展结果执行分词所必需的,当然内部撇号也没有了,因为它们导致了主要问题。

相关内容

  • 没有找到相关文章

最新更新