AWK实现两文件列匹配并输出指定列的技术需求
我来帮你搞定这个文本匹配的增强需求,用awk就能完美实现,下面是完整的脚本和详细说明:
完整实现脚本
把下面的代码保存为match_nodes.awk:
# 预处理File2,构建前5字符到loopback地址的映射表 NR == FNR { # 截取第1列的前5个字符作为匹配键 key = substr($1, 1, 5) # 存储键对应的loopback地址(第2列) loopback_map[key] = $2 # 跳过后续逻辑,处理下一行 next } # 处理File1的每一行 { # 分别截取第1列和第3列的前5个字符 key_col1 = substr($1, 1, 5) key_col3 = substr($3, 1, 5) # 从映射表中获取对应的loopback地址,没匹配到则设为空字符串(可改成"NA"标记) val_col1 = (key_col1 in loopback_map) ? loopback_map[key_col1] : "" val_col3 = (key_col3 in loopback_map) ? loopback_map[key_col3] : "" # 输出原行 + 两个匹配到的loopback地址 print $0, val_col1, val_col3 }
使用方法
在终端中运行以下命令(替换成你的实际文件名):
awk -f match_nodes.awk "File2-Node_Loopbacks.txt" "File1-Node_Links.txt"
脚本说明
- 预处理File2:
NR == FNR是awk的经典写法,用来识别第一个输入文件(这里是File2),我们把每个行的第1列前5字符作为键,对应的第2列loopback地址存在数组里,方便后续快速查找。 - 匹配File1:对File1的每一行,分别提取第1、3列的前5字符,去映射表中查找对应的loopback地址,没找到就用空字符串填充(你可以根据需求改成
"NO_MATCH"这类标记)。 - 输出结果:把原行内容和两个匹配到的地址拼接后输出,完美满足你追加两个新列的需求。
示例演示
假设你的文件内容如下:
File2-Node_Loopbacks.txt
ABCDE123 10.0.0.1 FGHIJ456 10.0.0.2 KLMNO789 10.0.0.3
File1-Node_Links.txt
ABCDEXXX eth0 FGHIJYYY KLMNOAAA eth1 PQRSTBBB XYZABC11 eth2 ABCDE222
运行脚本后输出:
ABCDEXXX eth0 FGHIJYYY 10.0.0.1 10.0.0.2 KLMNOAAA eth1 PQRSTBBB 10.0.0.3 XYZABC11 eth2 ABCDE222 10.0.0.1
内容的提问来源于stack exchange,提问作者user3746195
相关产品推荐
相关产品推荐

