我有很多文件(>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