You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 11:39:02