如何在awk中使用正则表达式过滤特定列:匹配首c/C或尾1/2
在awk中用正则筛选特定列的正确方法
先纠正你之前的错误用法
- 用
$1=="c*"是精确字符串匹配,只会匹配字段值正好是c*的行,不是你想要的通配匹配 - 用
$1~"^c*"的问题在于*是匹配零个或多个前导字符,^c*会匹配所有行(因为空字符串也符合"零个c开头"),完全达不到筛选效果
正确的正则匹配写法
你需要筛选的是首列以c/C开头,或者以1/2结尾的行,对应的awk正则表达式如下:
- 匹配以c或C开头的首列:
$1 ~ /^[cC]/ - 匹配以1或2结尾的首列:
$1 ~ /[12]$/ - 合并两个条件(逻辑或,满足任意一个即可):
awk '$1 ~ /^[cC]/ || $1 ~ /[12]$/' file2.csv
针对你提到的「仅输出首列为col1的行」的需求
这种场景更适合精确字符串匹配,直接用==即可:
awk '$1 == "col1"' file2.csv
如果一定要用正则实现精确匹配,需要加上开头和结尾锚点,避免匹配到col12这类字符串:
awk '$1 ~ /^col1$/' file2.csv
关键知识点说明
~是awk中专门用于正则匹配的操作符,而==是精确字符串比较,不支持通配符^表示字段的开头,$表示字段的结尾,加上这两个锚点可以避免部分匹配[abc]是字符组,匹配括号内任意一个字符,比如[cC]匹配小写c或大写C
内容的提问来源于stack exchange,提问作者HattrickNZ
相关产品推荐
相关产品推荐

