如何使用awk/grep匹配两个文件的Username字段并合并对应内容?
解决方案
问题原因
你编写的命令存在两个问题:
- 变量大小写不匹配:
read定义的变量是Username,后续调用写的是$username,Shell 变量大小写敏感,会导致匹配失效 grep输出默认自带换行符,后续执行echo $IP又会新增换行,因此 IP 会单独占一行
方案1:调整原有循环命令
可以先把grep匹配到的行存入临时变量,再和IP地址合并输出,同时跳过file1的表头行,主动打印统一表头:
# 打印表头 echo "firstname Lastname Username IPaddress" # 处理内容行 awk 'NR>1 {print $2,$1}' file1 | while read Username IP ; do match_line=$(grep "$Username" file2) echo "$match_line $IP" done | column -t
方案2:单awk命令实现(更高效)
不需要管道加循环,直接用awk同时处理两个文件,性能更好,适合大文件场景:
awk ' # 处理第一个文件file1,存储Username和IP的映射关系 NR == FNR { if(NR>1) ip[$2] = $1 next } # 处理第二个文件file2,拼接对应IP输出 { print $0, (FNR==1 ? "IPaddress" : ip[$3]) } ' file1 file2 | column -t
执行后输出完全符合预期:
firstname Lastname Username IPaddress Mozes Bowman user1 34.244.47.32 Jazzmyn Parrish user2 3.249.198.34 Chet Woods user3 52.215.73.213
内容的提问来源于stack exchange,提问作者Kerkael Belarpaillon
相关产品推荐
相关产品推荐

