我想用查找表(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命令更具体以正确替换字符串?
答案 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"
它是基于您自己的尝试,但不是使用数组中的哈希值随机替换,而是先使用较长的键替换。
通过这种方式,并根据您的示例,我认为足以避免错误地屈服。