我怎样才能仅在具有特定文件名的文件中查找模式?

我怎样才能仅在具有特定文件名的文件中查找模式?

我花了很多时间搜索有关我的问题的现有问题,但我没有找到针对此案例的任何具体解决方案。如果有现有的帖子/问题可以解决此问题,我提前道歉,如果有人能为我指明方向,我将不胜感激。

我需要在数据系统中的众多文件中搜索一个模式(例如“GENE”)。但是,数据集的名称如下:

foo_1549474392_93.nwk
foo_1549474392_93.ort.final.nwk
foo_1549474392_93.ort.nwk
foo_1549474392_93.ort_reroot.nwk

这些是用于分析 n# 93 的文本文件。总共有 550 个。问题是,我必须找到模式仅有的在名为“foo_1549474392_93.nwk”的文件中(即:任何内容 + 下划线 + 数字 + .nwk,数字范围从 1 到 550,而不是 001 到 550)。下划线之前的所有内容均无关紧要。

我已经尝试过了

grep "GENE" *'/d'.nwk 

以及使用 [0-9] 等等的多种变体。

非常感谢你的帮助!

答案1

要搜索名称与任何内容 + 下划线 + 数字 + .nwk 匹配的任何文件,数字从 1 到 550,不包括 001、551 等,请尝试:

shopt -s nullglob; grep GENE  *_{1..550}.nwk

因为{1..550}扩展为您想要的数字(并且只扩展为您想要的数字),所以 glob*_{1..550}.nwk将仅包含您想要的文件。为了确保扩展中的所有文件确实存在于目录中,我们设置nullglobshopt -s nullglob

由于您可能不希望 nullglob 中的更改影响其他命令,因此使用括号将命令放入子 shell 中可能会很有用。

(shopt -s nullglob; grep GENE  *_{1..550}.nwk)

nullglob 中的更改仅影响子 shell(括号内的内容),而不影响其之前或之后的任何内容。

例子

让我们用 创建四个文件GENE,其中两个符合您的文件名标准,两个不符合:

$ echo GENE | tee bad_1224_01.nwk bad_3456_551.nwk good_23456_1.nwk good_763456_550.nwk
GENE
$ ls
bad_1224_01.nwk  bad_3456_551.nwk  good_23456_1.nwk  good_763456_550.nwk

现在,让我们运行命令:

$ (shopt -s nullglob; grep GENE  *_{1..550}.nwk)
good_23456_1.nwk:GENE
good_763456_550.nwk:GENE

不需要的文件被排除并且找到好的名称。

为了进行比较,让我们尝试一下:

$ grep "GENE" *[0-9].nwk 
bad_1224_01.nwk:GENE
bad_3456_551.nwk:GENE
good_23456_1.nwk:GENE
good_763456_550.nwk:GENE

这与不需要的文件匹配。

相关内容