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