首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果前两列在两个变量中相同,则替换第三列的值。

如果前两列在两个变量中相同,则替换第三列的值。
EN

Stack Overflow用户
提问于 2017-06-26 10:32:58
回答 2查看 256关注 0票数 2

如果前两列在两个变量中相同,则需要替换第三列的值。

我尝试:使用NR===FNR存储第一个变量的第一列和第二列。如果第一列和第二列相同,则将变量"b“的第三列替换为变量"s”的第三列。但是,执行$3=$3没有任何意义。

代码语言:javascript
复制
awk 'NR==FNR{a[$1FS$2]=$1FS$2;next} $1FS$2 in a {$3=$3}1' <(echo "$s") <(echo "$b")
NODE AREA-29 1 UP ENABLED PINGABLE ASIA ACTIVE
NODE AREA-21 1 UP ENABLED PINGABLE ASIA ACTIVE
NODE AREA-20 1 UP ENABLED PINGABLE ASIA ACTIVE


echo "$b"
NODE  AREA-29  1   UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-21  1   UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-20  1   UP   ENABLED     PINGABLE  ASIA                   ACTIVE


echo "$s"
NODE  AREA-21   2
NODE  AREA-29   10
NODE  AREA-20   1

预期结果:

代码语言:javascript
复制
NODE  AREA-29  10  UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-21  2   UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-20  1   UP   ENABLED     PINGABLE  ASIA                   ACTIVE
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-26 10:49:48

正确的方法:

代码语言:javascript
复制
awk -v OFS='\t' 'NR==FNR{ a[$1,$2]=$3; next }(($1,$2) in a){ $3=a[$1,$2] }1' <(echo "$s") <(echo "$b")

产出:

代码语言:javascript
复制
NODE    AREA-29 10  UP  ENABLED PINGABLE    ASIA    ACTIVE
NODE    AREA-21 2   UP  ENABLED PINGABLE    ASIA    ACTIVE
NODE    AREA-20 1   UP  ENABLED PINGABLE    ASIA    ACTIVE

标准awk通过用逗号分隔下标值来模拟多维数组。这些值被串联成一个字符串,由SUBSEP的值分隔。

票数 2
EN

Stack Overflow用户

发布于 2017-06-26 10:53:05

这是我的解决方案:

代码语言:javascript
复制
awk 'NR==FNR{a[$1FS$2]=$3;next}$1FS$2 in a { $3 = a[$1FS$2] }1' <(echo "$s") <(echo "$b") 

这一次只取$3作为数组a中的值,如果找到匹配,则会发生$3的替换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44757770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档