【问题标题】:how to run grep from script and store output in a file in the destination directory from bash script如何从脚本运行 grep 并将输出存储在 bash 脚本的目标目录中的文件中
【发布时间】:2018-07-07 14:00:12
【问题描述】:

我正在尝试通过 bash 脚本过滤掉文件中的行。我可以通过运行命令从脚本位置找到文件的路径

Fgff=`find $D -maxdepth 1 -type f -name "*.gff"`

我可以通过运行命令向找到的 .gff 文件添加一列

   sed -i '1 s/$/\tsample/; 1! s/$/\t'${D##*/}'/' $Fpsi

但是,如果我尝试过滤文件并将输出写入同一文件夹中的另一个文件,则它不起作用。

grep 'ENSG00000155657\|ENSG00000198947' $Fgff > "$Fgff$filtered"

我想知道为什么 grep 不起作用?

如何在./dira/dirb/apple.gff 的文件apple.gff 中过滤所有具有子字符串ENSG00000155657 或ENSG00000198947 的行并将其存储在./dira/dirb/applefiltered.gff 中?

谢谢

【问题讨论】:

  • 使用grep -E 'ENSG00000155657|ENSG00000198947' 并去掉反斜杠。 -E 打开扩展正则表达式(egrep 模式适用于我们这些在上个千年学习 Unix 的人)。
  • 一般来说,最好使用$(…)而不是反引号来捕获命令的输出。您可能需要担心文件名中的空格和其他奇怪字符可能存在问题。
  • @JonathanLeffler 感谢 -E 并删除 / 成功了。除原始文件外,文件在同一目录中制作。在发布问题之前花了几个小时,但现在很高兴排序。

标签: linux bash shell sed grep


【解决方案1】:

如果您的 $Fgff 包含正确的文件名,您的 grep 命令会完全按照您的要求执行,搜索字符串 'ENSG0000015565(7\|E)NSG00000198947' 而您可能想要 '(ENSG00000155657)\|(ENSG00000198947)' .

【讨论】:

  • 这是对原始正则表达式的不太可能的解释。
  • @JonathanLeffler 感谢您的纠正,我修改了对正则表达式的理解。
猜你喜欢
  • 2014-11-03
  • 2022-01-14
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多