如何根据另一个文件中的列表值从csv文件中删除行?

kar*_*fen 2 csv bash awk grep sed

我有两个文件:

candidates.csv:

id,value
1,123
4,1
2,5
50,5
Run Code Online (Sandbox Code Playgroud)

blacklist.csv:

1
2
5
3
10
Run Code Online (Sandbox Code Playgroud)

我想删除candidates.csv第一列(id)中包含值的所有行blacklist.csv.id始终是数字.在这种情况下,我希望我的输出看起来像这样:

id,value
4,1
50,5
Run Code Online (Sandbox Code Playgroud)

到目前为止,我用于识别重复行的脚本如下所示:

cat candidates.csv | cut -d \, -f 1 | grep -f blacklist.csv -w
Run Code Online (Sandbox Code Playgroud)

这给了我输出

1
2
Run Code Online (Sandbox Code Playgroud)

现在我不知何故需要将这些信息反馈到sed/ awk/ gawk/ ...以删除重复项,但我不知道如何.我有什么想法可以从这里继续吗?或者是否有更好的解决方案?我唯一的限制是它必须在bash中运行.

kva*_*our 7

以下内容如何:

 awk -F, '(NR==FNR){a[$1];next}!($1 in a)' blacklist.csv candidates.csv
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

awk程序是一系列模式 - 动作对,写成:

condition { action }
condition { action }
...
Run Code Online (Sandbox Code Playgroud)

其中condition通常是表达式和action一系列命令.这里,第一个条件 - 动作对读取:

  • (NR==FNR){a[$1];next}如果总记录数NR等于文件的记录数FNR(即如果我们正在读取第一个文件),则将所有值存储在数组中a并跳到下一条记录(不要做任何其他事情)
  • !($1 in a)如果第一个字段不在数组中,a则执行默认操作,即打印该行.这仅适用于第二个文件,因为第一个条件 - 动作对的条件不成立.