我有两个制表符分隔的文件,我需要将文件 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.p1
和protein_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 ,则内置变量RSTART
,RLENGTH
保存匹配字符串的索引和长度,这个子字符串就是我们使用的哈希。用法:
> 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] 删除。
我来说两句