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

Extracting lines from file using grep in a for loop, exporting to new file with variable in file name

我正在尝试使用 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.

提前致谢!

因为...

What this code does is simply make a blank file for every variable.

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

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

    grep "'${variable}'" \

...并不代表您认为的意思。您费尽心思将文字撇号 (') 添加到模式中,但这些在该上下文中没有特殊含义。您的模式与任何行都不匹配,因为在数据中,目标字符串的出现周围没有撇号。

这样会更好:

    grep -F -e "${variable}" \

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