如何修改Linux下多文件VLOOKUP的awk脚本以获取目标输出?
修正后的AWK多文件VLOOKUP脚本
首先修正脚本的核心问题,以下是可以实现多文件关联匹配的AWK脚本:
#!/usr/bin/awk -f # 处理第一个输入文件(主表),存储键与对应整行内容 FNR == NR { a[$1] = $0 next } # 处理后续文件,匹配键后追加当前行的非键列内容 $1 in a { # 从第2列开始截取当前行内容,追加到对应记录后 a[$1] = a[$1] "\t" substr($0, index($0, $2)) } # 输出所有匹配完成的记录 END { for (key in a) { print a[key] } }
原脚本的问题说明
- Shebang错误:原脚本开头使用
#!/bin/bash,但这是AWK脚本,应该用#!/usr/bin/awk -f指定正确解释器 - 初始存储逻辑缺失:原脚本仅存储了第一个文件的键,没有保留主表的完整内容
- 拼接逻辑错误:原脚本重复拼接键值而非当前文件的有效数据列
- 输出格式混乱:原输出会重复打印键值,导致结果冗余
脚本逻辑说明
- 主表处理:
FNR == NR是AWK中判断当前处理第一个文件的标准写法,这里把主表(file1)的每一行按$1作为键存入数组,保留整行内容 - 关联匹配:后续处理file2-file4时,若当前行的
$1存在于主表的键集合中,就把当前行除$1外的所有内容追加到主表对应记录的末尾,用制表符分隔 - 结果输出:遍历数组,输出所有完成关联拼接的记录
执行命令
保持原执行命令不变即可:
awk -f TEST.sh file1 file2 file3 file4 > a.txt
如果你的目标输出需要处理无匹配项显示空值的场景,可以进一步调整脚本逻辑:
#!/usr/bin/awk -f # 先收集所有文件的键,以及每个文件的列数 BEGIN { file_count = ARGC - 1 } FNR == 1 { file_idx++ } # 存储每个文件中键对应的行内容 { key = $1 if (file_idx == 1) { main[key] = $0 } else { data[file_idx][key] = substr($0, index($0, $2)) } all_keys[key] = 1 } END { for (key in all_keys) { printf "%s", main[key] ? main[key] : key for (i = 2; i <= file_count; i++) { printf "\t%s", data[i][key] ? data[i][key] : "" } print "" } }
这个版本会保留所有出现过的键,即使主表中没有的键也会输出,且无匹配的列显示为空制表位。
内容的提问来源于stack exchange,提问作者ccysrrr
相关产品推荐
相关产品推荐

