如何使用AWK或grep实现分隔文件指定列的精确值匹配
问题原因
你当前的写法存在两个核心问题:
- egrep默认执行子串模糊匹配,不会校验值是否完全相等,所以
A1会匹配到包含该子串的A11 - 没有限定匹配内容必须出现在第一列的位置,行内任意位置出现匹配值都会被返回
另外你用逐行读取+每次遍历全文件的写法性能极低,文件稍大就会非常慢。
解决方案
最优方案:用awk实现(天生支持按列处理)
awk自带字段分割能力,直接按列做精确值匹配即可,一行命令就能完成需求:
如果固定匹配第一列值为A1的行:
awk -F '|' '$1 == "A1"' your_file
如果要动态取第一行第一列的值作为匹配目标(不用手动写死A1):
awk -F '|' 'NR==1{target=$1} $1 == target' your_file
针对你给出的示例数据集,执行后会输出预期结果:
A1|B1|C1 A1|B23|C97
方案2:坚持用grep实现的修改方法
给匹配规则加行首锚定和列分隔符边界,确保匹配的是第一列的完整值:
# 固定匹配A1 grep '^A1|' your_file # 循环中使用变量的写法(注意用双引号解析变量) x1=$(grep "^$A|" $file)
补充说明
如果后续需要匹配其他列,修改awk的字段序号即可,比如匹配第二列等于B2的行,直接写awk -F '|' '$2 == "B2"' your_file,比grep的写法灵活很多。
内容的提问来源于stack exchange,提问作者vj56789
相关产品推荐
相关产品推荐

