AWK 从文件比较中打印出不匹配的记录

AWK print out the mis-matched records from files comparison

我需要你的帮助来从 AIX 6.x.

上的以下示例中找到 Employee.txt 中不匹配的列表

Employee.txt

1|Sam|Smith|Seatle
2|Barry|Jones|Seatle
3|Garry|Brown|Houston
4|George|Bla|LA
5|Celine|Wood|Atlanta
6|Jody|Ford|Chicago

Car.txt

100|red|1
110|green|9
120|yellow|2
130|yellow|6
140|red|8
150|white|0

bash-4.3$ awk -F"|" 'NR==FNR { empcar[]=[=11=]; next } { if (empcar[]) print empcar[] "|"  "|"  > "match.txt"; else print [=11=] > "no_match.txt" }' Employee.txt Car.txt
110|green|9
140|red|8
150|white|0

match.txt
1|Sam|Smith|Seatle|100|red
2|Barry|Jones|Seatle|120|yellow
6|Jody|Ford|Chicago|130|yellow

no_match.txt
110|green|9
140|red|8
150|white|0

bash-4.3$ awk -F"|" 'NR==FNR { empcar[]=[=11=]; next } !( in empcar)' employee.txt car.txt produced the same list as in the no_match.txt.

但是,我希望 no_match.txt 如下所示:

3|Garry|Brown|Houston
4|George|Bla|LA
5|Celine|Wood|Atlanta

也就是说,当没有员工编号时,打印Employee.txt中的行。在 Car.txt。我不知道如何在 else 语句中引用那些不匹配的记录。

我在match.txt中也遇到了很多不明原因的重复,我的私人机密数据不能公开。

非常感谢, 乔治

print the row in Employee.txt when does not have employee no. in Car.txt.

您可以使用此解决方案:

awk -F"|" '
NR == FNR {
   empcar[]
   next
}
{
   print > ( in empcar ? "match.txt" : "no_match.txt")
}' Car.txt Employee.txt

cat match.txt

1|Sam|Smith|Seatle
2|Barry|Jones|Seatle
6|Jody|Ford|Chicago

cat no_match.txt

3|Garry|Brown|Houston
4|George|Bla|LA
5|Celine|Wood|Atlanta

请注意,我们将 Car.txt 作为第一个文件处理,并将第三个字段中的所有 ID 存储在数组 empcar 中。稍后在处理 Employee.txt 时,我们只是根据条件重定向输出以匹配或不匹配,如果来自后面文件的 </code> 是否存在于关联数组 <code>empcar 中。