awk - 用于字符串替换和打印匹配和不匹配字符串的 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
(正在努力学习)。
解决方案
表达式($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
推荐阅读
- c# - 为 .NET Core 3.1 Web 应用程序实施 Windows 身份验证
- php - 更改“woocommerce_template_loop_product_title”标题标签
- python - 使用高斯消元法用多项式逼近正弦函数
- postgresql - 无法在 powershell 中运行 pg_basebackup
- ios - 如何为渐变边框层添加阴影。参考下图
- c# - 在 RDLC 报告中将数字与字符串连接起来
- amazon-web-services - 如果我失去互联网连接并返回内核,如何知道 aws sagemaker 的训练状态
- mysql - Codeigniter MySQL 更新
- python - 逐个字符读取文件并从字典中赋值
- odoo - odoo.tools.convert.ParseError:“在系统中找不到外部 ID:project_manage.view_project_turn_over_action”在 Odoo12