如何在bash中删除CSV文件内与另一文件第一列完全匹配的行?
实现方案
优先推荐awk方案(效率最高、匹配最准确)
直接执行以下命令即可得到符合要求的结果:
awk 'NR==FNR {del[$0]; next} !($1 in del)' B A
命令解释:
NR==FNR {del[$0]; next}:处理第一个输入文件(此处是B)时,将文件B的每一行内容作为键存入名为del的哈希数组,处理完B后跳过后续逻辑!($1 in del):处理第二个输入文件(此处是A)时,仅当行的第一列不存在于del数组中时才打印该行,保证是完全匹配第一列,不会出现前缀误删的问题
直接修改原文件A的方法:
如果使用的是gawk 4.1及以上版本,可以直接原地修改文件:
awk -i inplace 'NR==FNR {del[$0]; next} !($1 in del)' B A
如果版本不支持,通过临时文件过渡即可:
awk 'NR==FNR {del[$0]; next} !($1 in del)' B A > A.tmp && mv A.tmp A
适配逗号分隔CSV的调整:
如果你的CSV文件是逗号作为分隔符,只需添加-F','参数指定字段分隔符即可:
awk -F',' 'NR==FNR {del[$0]; next} !($1 in del)' B A
可选grep方案(仅适用于第一列无特殊字符场景)
如果第一列内容仅由字母、数字、下划线组成,也可以用grep实现:
grep -v -w -F -f B A
参数说明:
-v:输出不匹配的行-w:按单词匹配,避免前缀误匹配-F:将模式当作普通字符串,不解析正则-f B:从文件B读取匹配模式
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

