如何配置grep -f行首匹配规则实现csv内容精准筛选
问题解决方法
直接grep匹配不符合预期的原因
默认grep -f input.csv target.csv会将input.csv的每一行作为匹配模式,在target.csv的每行任意位置查找匹配,因此会出现误匹配:比如2345,client1会匹配到target中22345,client1,2021-09-14行的后半段,导致输出多余结果。
实现行首匹配的方案
你需要给每个匹配规则增加行首锚定逻辑,同时开启固定字符串匹配避免特殊字符干扰,命令如下:
grep -F -f <(sed 's/^/^/' input.csv) target.csv
参数说明
-F:将所有输入模式视为固定字符串,避免csv内容中存在正则特殊字符(如.、*)时匹配异常sed 's/^/^/' input.csv:给input.csv的每一行前缀添加正则行首锚定符^,强制所有模式只能匹配target.csv每行的开头位置-f:指定从预处理后的input内容中读取匹配模式
更稳妥的结构化匹配方案
因为是csv结构化文件,按字段匹配完全不会出现误匹配问题,推荐用awk实现:
awk -F',' 'NR==FNR{map[$1","$2]=1;next} ($1","$2) in map' input.csv target.csv
这个命令会先读取input.csv的前两列作为匹配键,再输出target.csv中前两列完全匹配的行,适配所有csv内容场景。
内容的提问来源于stack exchange,提问作者ppatidar
相关产品推荐
相关产品推荐

