我正在尝试使用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不会对扩展结果执行分词所必需的,当然内部撇号也没有了,因为它们导致了主要问题。