使用 Unix

问题描述

File_1.txt

emp_id|emp_name|emp_dob
111|Alex|08/29/1994
222|John|05/12/1997
333|Sam|08/24/1987

File_2.txt

emp_id|emp_dob|emp_name
111|08/29/1994|Alex
444|05/12/2000|John
222|05/12/1997|Brad

需要使用 header(File_1.txt) 中提到的列来比较 File_2.txthead -1 File_1.txtemp_id 可用于连接条件

比较后,应生成以下文件

Mismatch.txt ## 包含按照 emp_id

的不匹配值
File_name|column_name|emp_id|File_1_value|File_2_value
File 1|emp_name|222|John|Brad

Missing_Rows.txt ## 包含文件 1 或文件 2 中缺少的 emp_id

File_name|emp_id
File 1|444
File 2|333

我可以使用 join 命令加入这 2 个文件,但无法找到缺失和不匹配行的详细信息。

join -j1 -t'|' -o1.1,1.2,1.3,2.1,2.2,2.3 <(cat  File_1.txt|awk -F'|' '{print $0}'|sort  -t '|' -k1,1)<( cat  File_2.txt|awk -F'|' '{print $0}'|sort -t '|' -k1,1) > joinfile.txt`

解决方法

对于您显示的示例,请尝试遵循 awk 代码。它将根据要求创建 2 个名为 Mismatch.txtMissing_Rows.txt 的输出文件。

awk '
BEGIN{
  FS=OFS="|"
  print "File_name|column_name|emp_id|File_1_value|File_2_value" > "Mismatch.txt"
  print "File_name|emp_id" > "Missing_Rows.txt"
}
FNR==NR{
  empId1[$1]=FILENAME OFS $0
  empId2[$1]=$2
  empVal[$1,$2]=$0
  next
}
{ empId3[$1] }
!($1 in empId1){
  print (FILENAME,$1) > "Missing_Rows.txt"
  next
}
($1 in empId1) && !(($1,$3) in empVal){
  print (FILENAME,empId2[$1],$NF) > "Mismatch.txt"
}
END{
  for(i in empId1){
    if(!(i in empId3)){
      split(empId1[i],arr,"|")
      print (arr[1],arr[2]) > "Missing_Rows.txt"
    }
  }
}
' file1.txt file2.txt