0

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

提前致谢!

4

1 回答 1

2

自从 ...

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

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

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

    grep "'${variable}'" \

...并不意味着您似乎认为它意味着什么。您费了一番功夫才将字面撇号 ( ') 加入到模式中,但在这种情况下,这些撇号没有特殊意义。您的模式不匹配任何行,因为在数据中,目标字符串的外观周围没有撇号。

这会更好:

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

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

于 2021-08-06T16:03:46.720 回答