AWK数组,替换为完整长度的键

时间:2019-01-18 21:47:41

标签: awk

我想用查找表(lookup.tab)中的字符串替换目标文件(target.txt)中的字符串,该表如下所示。

Seq_1 Name_one
Seq_2 Name_two
Seq_3 Name_three
...
Seq_10 Name_ten
Seq_11 Name_eleven
Seq_12 Name_twelve

target.txt文件是具有树结构(Nexus格式)的大文件。它没有按列排列。

因此,我使用以下命令:

awk 'FNR==NR { array[$1]=$2; next } { for (i in array) gsub(i, array[i]) }1'  "lookup.tab" "target.txt"

不幸的是,此命令没有占用第一列中元素的完整长度,因此Seq_1,Seq_10,Seq_11,Seq_12最终以Name_one,Name_one0,Name_one1,Name_one2等开头。

如何使awk命令更具体以正确替换字符串?

1 个答案:

答案 0 :(得分:0)

请尝试此操作,看它是否满足您的需求:

awk 'FNR==NR { le=length($1); a[le][$1]=$2; if (maxL<le) maxL=le; next } { for(le=maxL;le>0;le--) if(length(a[le])) for (i in a[le]) gsub(i, a[le][i]) }1'  "lookup.tab" "target.txt"

它是基于您自己的尝试,但不是使用数组中的哈希值随机替换,而是先使用较长的键替换。
通过这种方式,并根据您的示例,我认为足以避免错误地屈服。