根据第二个文件中的模式匹配映射第一个文件的字段

世界日报

我有两个制表符分隔的文件,我需要将文件 1 第一列中的文本与文件 2 行中的任何位置进行匹配。匹配后,我想打印文件 1 匹配行的第二列中的内容文件 2 中匹配行的结尾(示例如下)。

我知道这几乎肯定可以用 awk 来完成,但我不太擅长使用 awk 或 sed,在这里搜索相关问题并尝试调整他们的脚本对我来说没有用。任何输入将不胜感激。

文件 1

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

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";

期望输出

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)";
比萨斯普

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

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.


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

BEGIN {OFS = FS = "\t"; re = "\\<protein_[[:digit:]]+.p[[:digit:]]+\\>"}
FNR == NR {if ($1 ~ re) arr[$1] = $2; next}
match($3, re) {$0 = $0 " " arr[substr($3,RSTART,RLENGTH)]}
{print}

笔记:

  • re: "protein_" 后跟一位或多位数字,".p" 和一位或多位数字 所有这些都在单词边界内。点是字面意思。Word 字符是[:alnum:]_所以其余的都是 bountaries。
  • 还对 的第一个字段进行了健全性检查file1
  • 如果match()找到 a ,则内置变量RSTARTRLENGTH保存匹配字符串的索引和长度,这个子字符串就是我们使用的哈希。

用法:

> 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)";

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

保留第一个文件中与第二个文件不匹配的行

AWK比较两个文件,如果匹配,则将第二个文件中的新列添加到第一个文件中

将第一个文件的第一和第二列与第二个文件的第一列匹配

在Python中,如何根据一个列中的值比较两个csv文件,并从第一个文件输出与第二个不匹配的记录

将第一个文件的每行逗号前的第一个值与第二个文件逐行匹配

比较第一个文件的第一列和第二个文件的第二列并进行匹配

如何基于第二个文件中的信息将信息分组在第一个文件中?

使用第一个字段替换和第二个作为搜索条件批量重命名匹配文件

如果第一个文件的行与Linux中第二个文件中存在的字符串匹配,如何删除该行?

必须将输入从第一个 python 文件传递到第二个 python 文件,并且应该在第一个 python 文件中调用第二个 python 文件函数

如何从PyQt5中的第二个文件访问第一个文件方法?

无法访问第二个JavaScript文件中的第一个JavaScript文件的数组内容

iTextPDF - 生成的第二个 PDF 文件显示第一个生成的 PDF 文件中的文本

在第一个查询中获取第二个查询作为字段

仅在第一个文件中保留其列号与第二个文件中的列号匹配的那些列

Bash / Regex:当某些第一个字段以引号和逗号开头时替换 CSV 文件中的第二个字段

比较2个文件,按第一个文件的顺序打印第二个文件的行

如何比较两个文件并打印仅与第一个文件匹配的第二个文件

仅当也存在于第二个文本文件中时,才根据第一个文本文件中的第二个字段组合两个文本文件

sed读取一个文件并删除第二个文件中的模式

根据第二个文件中的更新更新一个excel文件

使用jQuery根据第一个选择列表选项显示第二个字段

为什么第一个模式中的 body 显示在第二个模式中?

从第一个文件中搜索第二个文件,然后输出到python中的第三个文件

Bash:有2个文件,如何检查第一个文件中的某个名称是否也出现在第二个文件中

html 日期选择器根据第一个日期字段中的选定日期限制第二个日期字段中的日期

Mysql:在第二个表中显示(选择)字段,在第一个表中显示匹配的键字段

从文件夹中获取文件名从第二个文件而不是从第一个文件开始

如果文件之间的第一个字段匹配,则用其他文件的第二个字段替换下一行