从多个文件中提取文件名和字符串

从多个文件中提取文件名和字符串

我有很多文件(>100,000),我想从中提取特定的字符串和文件名本身。文件的组织方式如下:

文件名:sequence.php?ID=gi|90022703|ref|YP_528530.1|

[Random text]

Description: Xylanase/Chitin Deacetylase-Like Protein [Saccharophagus Degradans 2-40]
Source: NCBI-Bacteria
Species: Saccharophagus degradans 2-40

Taxonomy: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

我想提取文件名(最好仅提取 ID= 之后的所有内容)和文件中“分类法”之后的所有内容。

就像是:

gi|90022703|ref|YP_528530.1| Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

这可能吗? (也适用于多个文件,即将每个新信息附加到文本输出文件)

答案1

处理多个文件时,grep在匹配项之前打印每个文件名。由于您不需要搜索正则表达式,因此您可以使用该-F选项来搜索固定字符串(这会加快速度);该-r选项指示grep递归操作。该-r选项来自 GNU 版本的grep,因此它不适用于具有其他版本 grep 的系统。

grep -r -F 'Taxonomy' /path/to/directory

这会给你这样的行:

sequence.php?ID=gi|90022703|ref|YP_528530.1|:Taxonomy: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

有多种方法可以将其调整为您想要的输出;一种是使用cut

grep -r -F 'Taxonomy' /path/to/directory | cut -d = -f 2 | cut -d : -f 1,3

这应该将该行变成:

gi|90022703|ref|YP_528530.1|: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

这与您所描述的不完全匹配;| tr -d :如果你真的想去除结肠,你可以把管子的末端放上去。最后,将输出重定向到文件:

grep -r -F 'Taxonomy' /path/to/directory | cut -d = -f 2 | cut -d : -f 1,3 > file.txt

如果您想追加到文件而不是覆盖它,请>>使用>.

答案2

awk '/^Taxonomy:/{t=FILENAME; sub(/^.*\?ID=/, x, t); $1=t; print; close(FILENAME)}' /files/location/* > output.txt

相关内容