我有两个文件:
candidates.csv
:
id,value
1,123
4,1
2,5
50,5
blacklist.csv
:
1
2
5
3
10
我想从 candidates.csv
中删除所有行其中第一列 ( id
) 的值包含在 blacklist.csv
中. id
始终是数字。在这种情况下,我希望我的输出看起来像这样:
id,value
4,1
50,5
到目前为止,我用于识别重复行的脚本如下所示:
cat candidates.csv | cut -d \, -f 1 | grep -f blacklist.csv -w
这给了我输出
1
2
现在我需要以某种方式将此信息通过管道返回到 sed
中/awk
/gawk
/...删除重复项,但我不知道如何。有什么想法可以从这里继续吗?还是有更好的解决方案?我唯一的限制是它必须在 bash 中运行。
最佳答案
以下情况如何:
awk -F, '(NR==FNR){a[$1];next}!($1 in a)' blacklist.csv candidates.csv
这是如何运作的?
awk 程序是一系列模式- Action 对,写为:
condition { action }
condition { action }
...
哪里condition
通常是一个表达式并且 action
一系列命令。在这里,第一个条件- Action 对显示为:
-
(NR==FNR){a[$1];next}
如果总记录数NR
等于文件的记录数FNR
(即如果我们正在读取第一个文件),将所有值存储在数组a
中并跳到下一条记录(不要做任何其他事情) -
!($1 in a)
如果第一个字段不在数组中a
然后执行打印该行的默认操作。这仅适用于第二个文件,因为第一个条件-操作对的条件不成立。
关于bash - 如何根据另一个文件的列表值从 csv 文件中删除行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52649404/