我有一个这样的文件(五个制表符分隔的列)
head allKO.txt
Metabolism Carbohydrate metabolism Glycolisis K07448
Metabolism Protein metabolism protesome K02217
我想在文件的第 5 列中搜索模式(字符串)KEGG.annotations
,如果找到,我想在另一个文件中打印找到KEGG.annotations
模式的行以及 的所有列allKO.txt
。我正在寻找模式的文件是:
head KEGG.annotations
>aai:AARI_24510 proP; proline/betaine transporter; K03762 MFS transporter, MHS family, proline/betaine transporter
>aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
>aai:AARI_28260 hypothetical protein
>aai:AARI_29060 ABC drug resistance transporter, inner membrane subunit; K09686 antibiotic transport system permease protein
>aai:AARI_29070 ABC drug resistance transporter, ATP-binding subunit (EC:3.6.3.-); K09687 antibiotic transport system ATP-binding protein
>aai:AARI_29650 hypothetical protein
>aai:AARI_32480 iron-siderophore ABC transporter ATP-binding subunit (EC:3.6.3.-); K02013 iron complex transport system ATP-binding protein [EC:3.6.3.34]
>aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system protein
我想要这样的东西:
Metabolism Carbohydrate metabolism Glycolisis K07448 >aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system
Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
请注意,>aai:AARI_33320 mrr; restriction …
附加到第一行的文本是 的第八行KEGG.annotations
,其中包含K07448
(是 的第一行的 ID 字段(第五个字段)allKO.txt
)。
如何修改此代码才能使用我的模式文件?这适用于只有一列包含要查找的特定模式的模式文件。
while read pat; do
grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1
答案1
您可以使用已有的代码。将该行存储到数组中并匹配第五个元素:
while read -r line; do
[ -z "$line" ] && continue
patlist=($line)
pat=${patlist[4]}
grep "$pat" --label="$line" -H < KEGG.annotations
done < allKO.txt
返回:
Metabolism Carbohydrate metabolism Glycolisis K07448:>aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system protein
Metabolism Protein metabolism protesome K02217:>aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
答案2
这似乎符合您的要求:
while read w1 w2 w3 w4 ID
do
printf "%s " "$w1 $w2 $w3 $w4 $ID"
if ! grep "$ID" KEGG.annotations
then
echo
fi
done < allKO.txt
这会将输出写入屏幕。将输出 ( >
) 重定向(例如> test1
)添加到最后一行以捕获文件中的输出。
- 根据您的示例,键/ID 字段(“模式”)是第五的五文件中的字段
allKO.txt
,所以我们read w1 w2 w3 w4 ID
.你说这是一个制表符分隔的文件;我假设所有字段都不包含空格。 - 写入 (
printf
) 来自 的行(即字段)allKO.txt
,末尾有一个空格,但没有终止换行符。 - 在(
grep
)KEGG.annotations
文件中搜索 ID(来自 的行中的第五个字段allKO.txt
)。这些将是完整的行(包括换行符)。 - 如果
grep
失败,请写一个换行符,因为printf
没有。 这将导致 ID 不存在的行
KEGG.annotations
被简单地写入输出:Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1] This ID doesn’t exist: K99999
并且多次存在的 ID 被写入附加行(不重复 中的数据
allKO.txt
):Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1] This is a hypothetical additional line from KEGG.annotations that mentions “K02217”.