![使用 awk 查找 file1 中的行而不是 file2 中没有匹配的行](https://linux22.com/image/173267/%E4%BD%BF%E7%94%A8%20awk%20%E6%9F%A5%E6%89%BE%20file1%20%E4%B8%AD%E7%9A%84%E8%A1%8C%E8%80%8C%E4%B8%8D%E6%98%AF%20file2%20%E4%B8%AD%E6%B2%A1%E6%9C%89%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
file1 包含我的信用卡费用列表:
A B
1/1/2020 $12.50
1/3/2020 $10.00
1/5/2020 $99.15
1/6/2020 $35.50
1/8/2020 $99.00
file2 包含合法购买的列表,日期不一定匹配,但 B 列中的金额应该匹配
A B
12/31/2020 $12.50
1/4/2020 $99.15
1/6/2020 $99.00
使用B列进行匹配,如何找到file1中在file2中没有匹配记录的记录?
A B
1/3/2020 $10.00
1/6/2020 $35.50
提前致谢!
答案1
$ awk 'NR==FNR{cnt[$2]++; next} (FNR==1) || (--cnt[$2] < 0)' file2 file1
A B
1/3/2020 $10.00
1/6/2020 $35.50
答案2
awk -F'$' '
FNR==NR{ if (FNR>1){ a[$2]++} next }
$2 in a && a[$2]{ a[$2]--; next }
1
' file2 file1
将 的值保存file2
在数组中并递增计数器以跳过标题行。继续下一行。
处理时file1
,测试数组中是否存在对应的值并且计数器是否非零。如果是这种情况,请递减计数器并继续下一行。
否则,打印当前行。
答案3
好吧,这不是awk
,有点凌乱,但它提供了有关比赛的更多信息
join -a 2 -j 2 <(sort -k 2 legit) <(sort -k 2 charged)
以及awk
上面其他的变体
awk 'NR==FNR{legit[$2]++; next}{legit[$2]--}legit[$2]<0{legit[$2]=0; print}' legit charged
答案4
命令
awk 'NR==FNR{a[$2];next}!($2 in a){print $0}' file2 file1
输出
1/3/2020 $10.00
1/6/2020 $35.50