![Bash 脚本用于比较两个格式化文件中的行](https://linux22.com/image/1031917/Bash%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%A1%8C.png)
我有两个格式化的文件,其中的行和字段由分隔符分隔(在本例中为 '*')
文件1:
qwerty*asd*1111111*poiu*222222*mnb
nbcvxm*hjf*3333333*jhjd*444444*bvc
dhfkjs*bmb*5555555*vcxz*666666*ewr
文件2:
cvcbfb*fgh*1111111*hgre*222222*hwg
qwerty*asd*2222222*poiu*333333*mnb
nbcvxm*hjf*4444444*jhjd*555555*bvc
tyterw*nbv*5555555*jhgf*666666*dsa
nbcvxm*hjf*7777777*jhjd*888888*bvc
我想获取 File1 中存在但不在 File2 中的行,但使用两个字段的并集作为比较标准
例如,使用 field_3 和 field_5 的并集作为比较标准
The line in File1 qwerty*asd*1111111*poiu*222222*mnb exist in File2 as cvcbfb*fgh*1111111*hgre*222222*hwg
The line in File1 dhfkjs*bmb*5555555*vcxz*666666*ewr exist in File2 as tyterw*nbv*5555555*jhgf*666666*dsa
因此,这种情况下预期的结果是:
nbcvxm*hjf*3333333*jhjd*444444*bvc
答案1
鉴于
$ head File{1,2}
==> File1 <==
qwerty*asd*1111111*poiu*222222*mnb
nbcvxm*hjf*3333333*jhjd*444444*bvc
dhfkjs*bmb*5555555*vcxz*666666*ewr
==> File2 <==
cvcbfb*fgh*1111111*hgre*222222*hwg
qwerty*asd*2222222*poiu*333333*mnb
nbcvxm*hjf*4444444*jhjd*555555*bvc
tyterw*nbv*5555555*jhgf*666666*dsa
nbcvxm*hjf*7777777*jhjd*888888*bvc
然后使用 awk
$ awk -F '*' 'NR==FNR {keys[$3, $5]; next} !( ($3 SUBSEP $5) in keys)' File2 File1
nbcvxm*hjf*3333333*jhjd*444444*bvc