求基于首列实现两个文件全外连接的Unix AWK命令
AWK实现基于第一列的全外连接
要实现app.txt和db.txt基于第一列的全外连接,同时满足app.txt中无db.txt匹配的记录显示空值+Yes的需求,可使用以下AWK命令:
BEGIN { OFS="\t" } # 可根据需求替换为空格或其他分隔符 # 读取db.txt,存储每条记录并记录所有key FNR==NR { data[$1] = $0 all_keys[$1] = 1 next } # 处理app.txt的每条记录 { # 提取app.txt中第一列之后的所有内容(适配多字段场景) app_content = substr($0, index($0, $2)) if ($1 in data) { # 匹配到db记录:输出db内容 + app后续内容 print data[$1], app_content } else { # 无匹配db记录:输出空值 + app后续内容 print "", app_content } # 标记该app的key已处理 processed[$1] = 1 } # 输出db中存在但app中无匹配的记录 END { for (key in all_keys) { if (!(key in processed)) { print data[key], "" } } }
命令说明
- BEGIN块:设置输出字段分隔符(OFS),这里用制表符
\t可清晰展示空值,可根据实际需求替换为空格或其他符号。 - 读取db.txt:将每条记录按第一列(key)存入
data数组,同时用all_keys数组记录所有db中的key。 - 处理app.txt:
- 提取第一列之后的所有内容,避免仅适配单个字段的场景;
- 若当前key在
data中存在,输出对应db记录加app后续内容; - 若不存在,输出空值加app后续内容;
- 标记该key已处理,避免后续重复输出。
- END块:遍历所有db中的key,输出那些在app中无匹配的记录,后续补充空值。
原命令问题分析
你之前使用的命令:
awk 'FNR==NR {data[$1]=$0; next} {$1=data[$1]}1' db.txt app.txt
问题在于当app.txt的key在db.txt中不存在时,data[$1]为空值,执行$1=data[$1]后第一列被替换为空,最终输出仅保留原app.txt的后续字段(即"Yes"),不符合空值+Yes的格式要求。
内容的提问来源于stack exchange,提问作者mangesh5171
相关产品推荐
相关产品推荐

