首页 > 解决方案 > 用于字符串替换和打印匹配和不匹配字符串的 awk 命令

问题描述

File-1我想用匹配的字符串替换多个字符串(超过一千个) File-2

File-1

Geneid Length s1 s2
1_1 6571 7 8
1_2 5041 3 0
1_3 1032 7 3    
1_4 1212 3 5    
1_5 1071 3 5    
2_1 7171 2 7
2_2 1038 1 1
2_3 9361 0 6
2_4 1056 5 1

File-2(地图):

1_1
1_2 k0002
1_3
1_4
1_5 k0006   
2_1
2_2
2_3
2_4 k0528

预期输出:

Geneid Length s1 s2
1_1 6571 7 8
k0002 5041 3 0
1_3 1032 7 3    
1_4 1212 3 5    
k0006 1071 3 5  
2_1 7171 2 7
2_2 1038 1 1
2_3 9361 0 6
k0528 1056 5 1

我使用了以下awk命令:

awk '
NR==FNR {                      
a[$1]=$2                    
next                       
}
{                               
print (($1 in a)?a[$1]:$1, $2, $3, $4)  
}' File-2 File-1 > File-3

这给了我这个:

Geneid  Length  s1  s2
 6571 7 8
k0002 5041 3 0
 1032 7 3   
 1212 3 5   
k0006 1071 3 5  
 7171 2 7
 1038 1 1
 9361 0 6
k0528 1056 5 1

如何修改此awk命令以保留不匹配的字符串?
抱歉,我是 linux 的新手并且awk(正在努力学习)。

标签: awk

解决方案


表达式($1 in a)?a[$1]:$1打印a[$1]或者$1取决于是否$1是 中的一个键a。但是您的所有键都在 中a,例如,对于键1_1,它会打印空字符串,即 的值a["1_1"]a解决方案是仅在为 in 中的键添加值时才进行填充$1

awk 'NR==FNR { if (NF > 1) a[$1]=$2; next }
{ print (($1 in a)?a[$1]:$1, $2, $3, $4) }' File-2 File-1

对于调试像您这样的脚本,它有助于print在各个点添加语句以查看脚本在做什么。这是我最终要做的,以找出您的脚本出了什么问题。

# STILL BUGGY, DEBUGGING RUN
awk 'NR==FNR { print("a[" $1 "]=" $2); a[$1]=$2; next; }
{ print ($1 in a ? a[$1] : $1), $2, $3, $4, ($1 in a), a[$1], $1, ($1 in a ? "yes" : "no"), "end" }' File-2 File-1

推荐阅读