使用AWK按条件匹配CSV文件并添加匹配状态的技术求助
解决CSV文件匹配并添加状态标记的问题
问题场景
已有两个CSV文件:
- file1.csv(包含主机名、IP、数值):
mac-test-1,10.32.9.12,15 mac-test-2,10.32.9.13,10 mac-test-3,10.32.9.14,11 mac-test-4,10.32.9.15,13
- file2.csv(包含需要匹配的主机名+IP组合):
mac-test-3,10.32.9.14 mac-test-4,10.32.9.15
需要实现:遍历file1的每一行,若该行前两列与file2中的某行完全匹配,则在末尾添加matched;否则添加no match。当file2为空时,所有行都添加no match。
原命令问题
你之前的命令仅输出匹配的行,未处理不匹配的记录:
awk -F "," 'NR==FNR{a[$1]; next} $1 in a {print $0",""matched"}' file2.csv file1.csv
原因是只对$1 in a的行执行print,其余行被跳过。
解决方案
使用以下awk命令,确保所有行都输出,同时通过前两列组合作为匹配键(避免主机名相同但IP不同的误匹配):
awk -F "," 'NR==FNR {key=$1","$2; a[key]; next} {key=$1","$2; print $0 ", " (key in a ? "matched" : "no match")}' file2.csv file1.csv
命令解释
处理file2.csv:
NR==FNR:仅在读取第一个输入文件(file2.csv)时执行此块key=$1","$2:将当前行的主机名和IP拼接成唯一匹配键a[key]:将该键存入数组a,用于后续匹配判断next:跳过后续逻辑,继续读取下一行
处理file1.csv:
- 同样生成当前行的前两列匹配键
key - 使用三元运算符
(key in a ? "matched" : "no match")判断匹配状态 - 输出原行内容+状态标记,确保所有行都被处理
- 同样生成当前行的前两列匹配键
测试结果
- 当file2.csv有内容时,输出符合预期:
mac-test-1,10.32.9.12,15, no match mac-test-2,10.32.9.13,10, no match mac-test-3,10.32.9.14,11, matched mac-test-4,10.32.9.15,13, matched
- 当file2.csv为空时,数组
a无内容,所有行输出no match:
mac-test-1,10.32.9.12,15, no match mac-test-2,10.32.9.13,10, no match mac-test-3,10.32.9.14,11, no match mac-test-4,10.32.9.15,13, no match
内容的提问来源于stack exchange,提问作者Akash Deep
相关产品推荐
相关产品推荐

