awk - 从 CSV 文件中删除与 bash 中另一个文件中的行匹配的行?
问题描述
我有一个具有以下结构的(大)CSV 文件(A):
1234ABC 456789
1235ABD 098732
1235ABE 098731
1235ABF 198731
另一个文件 (B) 包含应从 A 中删除的条目:
1234ABC
1235ABE
我想运行一个awk
orsed
命令(或一些命令行脚本,如果awk
或sed
不够的话),它从 A 中删除所有行,其第一列等于 BIe 中的一行,脚本运行后 A 中的结果应该是:
1235ABD 098732
1235ABF 198731
请注意,仅删除 A 中以 B 中的任何行开头的行是不够的。例如,如果 A 包含:
1235AC 456789
1235A 098732
和 B 包含:
1235A
那么 A 应该在之后包含这个:
1235AC 456789
我怎样才能在 bash 中实现这一点,最好使用awk
or sed
(或如果需要,可以使用 shell 脚本)?
解决方案
你可以使用这个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
。
推荐阅读
- mule - MuleSoft 的一般开发最佳实践是什么
- reactjs - SyntaxError:无法在模块 React JS Antd 之外使用 import 语句
- javascript - 使用 jQuery 或 JavaScript 自动搜索 bootstrap-select
- javascript - 托管在 heroku 上的 MERN 应用程序的架构帮助
- php - PHP strlen没有捕获特殊字符
- java - Java.Lang.NoSuchMethodError: '没有静态方法 checkBuilderRequirement
- powershell - 我们如何使用服务帐户凭据在 powershell 中获取共享邮箱列表
- c# - 解析网络服务器名称的 JSON 时出错
- postgresql - Bitnami Postgresql 与 Kubernetes Istio
- azure - 我的 Azure ADO 令牌本地存储在哪里?