使用 awk 在前面没有数字时如何匹配字符串?

use*_*373 0 awk text-processing

我有一个文件,其中第二列如下所示:

37M533N38M
14M1170N45M233N16M
3S45M3N35M
Run Code Online (Sandbox Code Playgroud)

我想提取那些包含字符串3N ,但之前立即没有其他号码3。因此,例如,A3N会匹配但23N不会。还应该注意的是3N,永远不会单独存在,并且字符串3N不会以3N. 结果应该是上面的第三行:

3S45M3N35M
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 awk 中做到这一点?我试过了,$2 ~ /3N/但这肯定行不通。

ter*_*don 5

您可以使用否定字符类:[^0-9]表示“除数字外的任何字符”:

awk '$2~/[^0-9]3N/' file
Run Code Online (Sandbox Code Playgroud)

如果您还想匹配3N在字段开头的情况,因此在它之前没有字符,请使用:

awk '$2~/(^|[^0-9])3N/' file
Run Code Online (Sandbox Code Playgroud)

如果您只想打印第二个字段而不是整行,请使用:

awk '$2~/[^0-9]3N/{print $2}' file
Run Code Online (Sandbox Code Playgroud)

或者

awk '$2~/(^|[^0-9])3N/{print $2}' file
Run Code Online (Sandbox Code Playgroud)