使用 awk 查找 file1 中的行而不是 file2 中没有匹配的行

使用 awk 查找 file1 中的行而不是 file2 中没有匹配的行

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

相关内容