awk - 从 bash 中删除与另一个文件中的行相匹配的 CSV 文件中的行?

标签 awk sed command-line terminal

<分区>

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

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

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

1234ABC
1235ABE

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

1235ABD 098732
1235ABF 198731

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

1235AC 456789
1235A 098732

并且 B 包含:

1235A

然后 A 之后应该包含这个:

1235AC 456789

我如何在 bash 中实现这一点,最好使用 awksed(如果需要,也可以使用 shell 脚本)?

最佳答案

你可以使用这个awk:

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

1235ABD 098732
1235ABF 198731

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

在第二遍中,我们只打印 file1 中的行,其中 $1 不存在于数组 dels 中。

关于awk - 从 bash 中删除与另一个文件中的行相匹配的 CSV 文件中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69031640/

相关文章:

unix - 删除unix中特定列中的最后一个字符

bash - Grep 匹配前每行中的所有字符

sed:删除与给定字段中的模式匹配的行

command-line - 处理多个文件名的 Unix 脚本

python - 查找给定文件名的日期错误的文件

bash - 从html中提取某些扩展链接

shell - 如何在 unix 中将一个 shell 脚本的输出捕获到另一个

regex - 带条件替换的正则表达式

windows - Teamcity 管道命令行输出到文件

java - 错误 : Could not find or load main class Test