![如何使用 awk 匹配前面没有数字的字符串?](https://linux22.com/image/105709/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20awk%20%E5%8C%B9%E9%85%8D%E5%89%8D%E9%9D%A2%E6%B2%A1%E6%9C%89%E6%95%B0%E5%AD%97%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我有一个文件,其中第二列如下所示:
37M533N38M
14M1170N45M233N16M
3S45M3N35M
我想提取那些包含的字符串3N
但之前没有其他数字3
。例如,A3N
会匹配但23N
不会匹配。还应该注意的是,3N
永远不会单独出现,并且字符串不会以 开头3N
,也不会以 结尾3N
。结果应该是上面的第三行:
3S45M3N35M
我怎样才能在 awk 中做到这一点?我已经尝试过$2 ~ /3N/
,但这肯定行不通。
答案1
您可以使用否定字符类:[^0-9]
表示“除数字之外的任何字符”:
awk '$2~/[^0-9]3N/' file
如果您还想匹配 is 位于3N
字段最开头的情况,因此前面没有字符,请使用:
awk '$2~/(^|[^0-9])3N/' file
如果您只想打印第二个字段而不是整行,请使用:
awk '$2~/[^0-9]3N/{print $2}' file
或者
awk '$2~/(^|[^0-9])3N/{print $2}' file
答案2
使用 grep:
grep [^0-9][3][N] file
v- 显示那些不匹配/反向匹配
[0-9][3][N]- 查找前面有正整数的 3N 的模式。
答案3
使用以下命令进行测试,对于上面的示例效果很好
awk '$2 ~ /[A-Za-z]3N/{print $0}' filename