【问题标题】:Extracting lines from file using grep in a for loop, exporting to new file with variable in file name在for循环中使用grep从文件中提取行,导出到文件名中带有变量的新文件
【发布时间】:2021-08-06 15:32:46
【问题描述】:

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

提前致谢!

【问题讨论】:

  • grep "'${variable}'" 正在寻找 ${variable} 用单引号 in samtools 输出,所以第一个想法是尝试 grep "${variable}"(没有单引号);另外,我在示例samtools 输出中看不到任何示例字符串(来自variables.txt),所以我希望您的脚本创建一堆空文件

标签: linux bash for-loop grep samtools


【解决方案1】:

因为...

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

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

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

    grep "'${variable}'" \

... 并不像您认为的那样。您已经费尽心思将文字撇号 (') 放入模式中,但在这种情况下,这些撇号没有特殊含义。您的模式不匹配任何行,因为在数据中,目标字符串的外观周围没有撇号。

这样会更好:

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

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

【讨论】:

  • 像魅力一样工作,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多