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中运行.
以下内容如何:
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则执行默认操作,即打印该行.这仅适用于第二个文件,因为第一个条件 - 动作对的条件不成立.