我花了很多时间搜索有关我的问题的现有问题,但我没有找到针对此案例的任何具体解决方案。如果有现有的帖子/问题可以解决此问题,我提前道歉,如果有人能为我指明方向,我将不胜感激。
我需要在数据系统中的众多文件中搜索一个模式(例如“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
将仅包含您想要的文件。为了确保扩展中的所有文件确实存在于目录中,我们设置nullglob
了 shopt -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
这与不需要的文件匹配。