如何在Unix中对比两个管道分隔文件并生成差异与缺失行文件
管道分隔结构化文件对比实现方案
前置说明
你当前的join命令存在两个问题:
- 默认仅输出双端匹配的行,无法捕获仅在单个文件存在的缺失行
- 未对齐File2的字段顺序(File2字段顺序为
emp_id|emp_dob|emp_name,和File1不一致,需要调整输出顺序才能正确对比)
完整实现命令
可以直接执行以下命令一步生成两个目标文件:
# 先清理旧的输出文件 rm -f Mismatch.txt Missing_Rows.txt # 写入两个文件的表头 echo "File_name|column_name|emp_id|File_1_value|File_2_value" > Mismatch.txt echo "File_name|emp_id" > Missing_Rows.txt # 调整join参数输出全量关联结果,再用awk做字段对比和输出 join -j1 -t'|' -a1 -a2 -e 'NULL' \ -o 1.1,1.2,1.3,2.1,2.3,2.2 \ <(tail -n +2 File_1.txt | sort -t'|' -k1,1) \ <(tail -n +2 File_2.txt | sort -t'|' -k1,1) | awk -F'|' ' # 处理仅在File1存在的行 $4 == "NULL" { print "File 2|"$1 >> "Missing_Rows.txt" next } # 处理仅在File2存在的行 $2 == "NULL" { print "File 1|"$1 >> "Missing_Rows.txt" next } # 双端存在的行,对比emp_name字段 $2 != $5 { print "File 1|emp_name|"$1"|"$2"|"$5 >> "Mismatch.txt" } # 对比emp_dob字段 $3 != $6 { print "File 1|emp_dob|"$1"|"$3"|"$6 >> "Mismatch.txt" } '
命令参数说明
join的-a1 -a2:输出仅在第一个文件、仅在第二个文件存在的行-e 'NULL':缺失字段填充为NULL,方便后续判断-o 1.1,1.2,1.3,2.1,2.3,2.2:调整File2的输出顺序,把原本第3位的emp_name放到第2位对比,第2位的emp_dob放到第3位对比tail -n +2:跳过两个文件的表头行,避免表头参与关联对比
输出结果验证
- Mismatch.txt内容:
File_name|column_name|emp_id|File_1_value|File_2_value File 1|emp_name|222|John|Brad
- Missing_Rows.txt内容:
File_name|emp_id File 2|333 File 1|444
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

