首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于第二文件模式匹配的第一文件映射字段

基于第二文件模式匹配的第一文件映射字段
EN

Unix & Linux用户
提问于 2020-11-24 19:22:34
回答 1查看 257关注 0票数 1

我有两个由制表符分隔的文件,其中我需要将文件1第一列中的文本与文件2行中的任何位置相匹配。在匹配时,我想要打印文件1的匹配行的第二列中的内容到文件2中匹配行的末尾(例如下面的例子)。

我知道这几乎可以用awk来完成,但是我不能很好地使用awk或sed,在这里搜索相关的问题,并且试图修改他们的脚本对我来说还没有成功。如有任何意见,将不胜感激。

档案1

代码语言:javascript
复制
protein_1.p1     note "PJD5F7, match to databaseID=64575, (species X)";
protein_1.p2     note "PJD5F7, match to databaseID=64575, (species X)";
protein_3.p1     note "PA5F9H, match to databaseID=93689, (species W)";
protein_4.p1     note "Q7GT5J, match to databaseID=89045, (species Y)";
protein_4.p3     note "YE6G3L, match to databaseID=44968, (species Z)";

档案2

代码语言:javascript
复制
chromosome_1    programID   transcript_id "protein_1.p1"; parent "protein_1";
chromosome_1    programID   transcript_id "protein_1.p2"; parent "protein_1";
chromosome_1    programID   transcript_id "protein_2.p1"; parent "protein_2";
chromosome_1    programID   transcript_id "protein_2.p2"; parent "protein_2";
chromosome_1    programID   transcript_id "protein_3.p1"; parent "protein_3";
chromosome_1    programID   transcript_id "protein_4.p1"; parent "protein_4";
chromosome_1    programID   transcript_id "protein_4.p2"; parent "protein_4";
chromosome_1    programID   transcript_id "protein_4.p3"; parent "protein_4";

期望输出

代码语言:javascript
复制
chromosome_1    programID   transcript_id "protein_1.p1"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_1.p2"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_2.p1"; parent "protein_2";
chromosome_1    programID   transcript_id "protein_2.p2"; parent "protein_2";
chromosome_1    programID   transcript_id "protein_3.p1"; parent "protein_3"; note "PA5F9H, match to databaseID=93689, (species W)";
chromosome_1    programID   transcript_id "protein_4.p1"; parent "protein_4"; note "Q7GT5J, match to databaseID=89045, (species Y)";
chromosome_1    programID   transcript_id "protein_4.p2"; parent "protein_4";
chromosome_1    programID   transcript_id "protein_4.p3"; parent "protein_4"; note "YE6G3L, match to databaseID=44968, (species Z)";
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-11-25 06:48:57

我们可以解析file1,映射值($2)到键($1),然后解析file2并将值追加到行,当行的一部分($3)匹配任何键时。

代码语言:javascript
复制
BEGIN {OFS = FS = "\t"}
FNR == NR {arr[$1] = $2; next}
{for (x in arr) if ($3 ~ x) {$0 = $0 " " arr[x]; break}}
{print}

这会为您的示例打印正确的结果,但由于许多原因,这并不是您想要的结果。第一个原因是,它可能会在各种情况下失败,比如protein_1.p1protein_1.p11。第二个原因是性能,file2的每一行时间不是恒定的,而是file1的大小。

所以我们必须修改上面的脚本。您可能希望为要匹配的蛋白质字符串定义正则表达式。这样,匹配就变得足够严格了,而且在第二次解析时,时间取决于字段上的正则表达式,而不是数组大小。

代码语言:javascript
复制
BEGIN {OFS = FS = "\t"; re = "\\"}
FNR == NR {if ($1 ~ re) arr[$1] = $2; next}
match($3, re) {$0 = $0 " " arr[substr($3,RSTART,RLENGTH)]}
{print}

备注:

  • re:"protein_“后面跟着一个或多个数字,".p”,再加上一个或多个数字--所有这些都是单词赏金。这个点是字面的。单词字符是[:alnum:]_,所以剩下的是赏金。
  • 另外,对于file1的第一个字段也有一个是否正确的检查。
  • 如果找到一个match(),那么内置变量RSTARTRLENGTH保存索引和匹配字符串的长度,这个子字符串就是我们在哈希中使用的。

用法:

代码语言:javascript
复制
> awk -f tst.awk file1 file2
chromosome_1    programID   transcript_id "protein_1.p1"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_1.p2"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_2.p1"; parent "protein_2"; 
chromosome_1    programID   transcript_id "protein_2.p2"; parent "protein_2"; 
chromosome_1    programID   transcript_id "protein_3.p1"; parent "protein_3"; note "PA5F9H, match to databaseID=93689, (species W)";
chromosome_1    programID   transcript_id "protein_4.p1"; parent "protein_4"; note "Q7GT5J, match to databaseID=89045, (species Y)";
chromosome_1    programID   transcript_id "protein_4.p2"; parent "protein_4"; 
chromosome_1    programID   transcript_id "protein_4.p3"; parent "protein_4"; note "YE6G3L, match to databaseID=44968, (species Z)";
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/621367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档