仅在键匹配时,awk替换另一个文件的特定值
我想比较2个文件,并将File1的第一列和File2的第二列作为数组中的密钥。然后,如果这些匹配,我希望File2的第三列替换File1的第三列。问题是,尽管我的尝试做到了这一点,但它们也一无所有代替其他行,只留下额外的空间。谢谢您的帮助! PS抱歉,我是新手堆栈溢出。
$ cat File1
1 name1 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1655915259 22/06/2022 server1 Active 0 [email protected]
3 name3 1655654205 19/06/2022 server1 Active 3 [email protected]
4 name4 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 1655900988 22/06/2022 server2 Active 0 [email protected]
$ cat File2
name1 1 1654250529 [email protected] 19 New_User
name2 2 1654250334 [email protected] 19 New_User
我的尝试:
awk 'FNR==NR{a[NR]=$3;next}{$3=a[FNR]}1' File2 File1 > File3
不希望的输出:
$ cat File3
1 name1 1654250529 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1654250334 22/06/2022 server1 Active 0 [email protected]
3 name3 19/06/2022 server1 Active 3 [email protected]
4 name4 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 22/06/2022 server2 Active 0 [email protected]
所需的输出:
$ cat File3
1 name1 1654250529 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1654250334 22/06/2022 server1 Active 0 [email protected]
3 name3 1655654205 19/06/2022 server1 Active 3 [email protected]
4 name4 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 1655900988 22/06/2022 server2 Active 0 [email protected]
编辑:肯特修复了它!干得好,谢谢!您是如何学会尴尬的?我总是只是在谷歌搜索并修改人们在Stackoverflow上发布的内容,但没有完全理解。
I want to compare 2 files and have the 1st column of File1 and the 2nd column of File2 to be the keys in the array. Then if those match I want the 3rd column of File2 to replace the 3rd column of File1. The issue is that while my attempts do that, they also replace the other rows with nothing and just leave an extra space. Thank you for the help! P.S. Sorry I am new to stack overflow.
$ cat File1
1 name1 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1655915259 22/06/2022 server1 Active 0 [email protected]
3 name3 1655654205 19/06/2022 server1 Active 3 [email protected]
4 name4 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 1655900988 22/06/2022 server2 Active 0 [email protected]
$ cat File2
name1 1 1654250529 [email protected] 19 New_User
name2 2 1654250334 [email protected] 19 New_User
My attempt:
awk 'FNR==NR{a[NR]=$3;next}{$3=a[FNR]}1' File2 File1 > File3
Undesired output:
$ cat File3
1 name1 1654250529 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1654250334 22/06/2022 server1 Active 0 [email protected]
3 name3 19/06/2022 server1 Active 3 [email protected]
4 name4 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 22/06/2022 server2 Active 0 [email protected]
Desired output:
$ cat File3
1 name1 1654250529 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
2 name2 1654250334 22/06/2022 server1 Active 0 [email protected]
3 name3 1655654205 19/06/2022 server1 Active 3 [email protected]
4 name4 1652504401 14/05/2022 Last_server_login_unkown Expired 40 [email protected]
5 name5 1655900988 22/06/2022 server2 Active 0 [email protected]
EDIT: Kent fixed it! Nice job and thank you! How did you learn to AWK so well? I am always just Googling things and modifying what people post on stackoverflow, but not fully understanding.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您很接近:
代码中的问题是,您错过了检查file2.key是否存在File1中的部分。
因此,使用列值代替NR /FNR作为关联数组的密钥会更容易。
You are close:
The problem in your code is, that you missed the part of checking if the file2.key exists in file1.
So, using the column value instead of the NR /FNR as the associative array's key would be easier.