首页 > 解决方案 > 从 CSV 文件中删除与 bash 中另一个文件中的行匹配的行?

问题描述

我有一个具有以下结构的(大)CSV 文件(A):

1234ABC 456789
1235ABD 098732
1235ABE 098731
1235ABF 198731

另一个文件 (B) 包含应从 A 中删除的条目:

1234ABC
1235ABE

我想运行一个awkorsed命令(或一些命令行脚本,如果awksed不够的话),它从 A 中删除所有行,其第一列等于 BIe 中的一行,脚本运行后 A 中的结果应该是:

1235ABD 098732
1235ABF 198731

请注意,仅删除 A 中以 B 中的任何行开头的行是不够的。例如,如果 A 包含:

1235AC 456789
1235A 098732

和 B 包含:

1235A

那么 A 应该在之后包含这个:

1235AC 456789

我怎样才能在 bash 中实现这一点,最好使用awkor sed(或如果需要,可以使用 shell 脚本)?

标签: awksedcommand-lineterminal

解决方案


你可以使用这个awk

awk 'NR == FNR {dels[$1]; next} !($1 in dels)' file2.csv file1.csv

1235ABD 098732
1235ABF 198731

这是标准的 2 遍 awk 命令,它将第一遍中的所有行存储file2在一个数组中dels

在第二遍中,我们只打印arrayfile1$1不存在的行dels


推荐阅读