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

标签 bash csv awk sed grep

我有两个文件:

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/

相关文章:

shell - shell中多个文件的平均值

bash - 为什么我的 bash 脚本中不断出现语法错误?它是否与 ":"相关?

java - Jmeter POST API问题

shell - 如何将yaml文件格式化为csv格式?

php - 当从 MySQL 中选择所有内容时,我可以重命名特定字段并仍然像使用 * 一样选择其他所有内容

java - 从 CSV 文件在 Oracle 中批量更新

linux - 列,宽度参数不起作用

bash - 如何使用 awk 解析 Amazon S3 日志?

linux - 使用 bash 脚本从 .bashrc 中删除一行

linux - BASH/sed - 不为简单的 sed 命令提供相同的输出