AWK:如何匹配逗号

时间:2019-07-07 02:28:59

标签: regex bash awk sed

我想从awk返回带有模式“ C”或“。,C”或“。,C,。*”的行。 例如:

有效

C,G
G,C
G,C,A

无效

G,CC

我的代码如下:

 echo G,CC | awk '$0 ~ /^C,+.*|.*,C,*.*/ {print $0}'

输出:

G,CC

我希望它对我没有任何帮助。不幸的是,它向我返回了“ G,CC”。

我该如何解决这个问题?

编辑:

基于@Emma和@perreal的答案。我使用了较短的命令行来解决我的问题:

awk '$0 ~ /^C,.*|.*,C,.*|.*,C$/ {print $0}'

直到现在,它都运行良好。谢谢您的帮助!

5 个答案:

答案 0 :(得分:3)

  • +^C,+.*中不是必需的,因为您已经匹配了逗号并且也匹配了之后的内容。

  • 第二个逗号后的*.*,C,*.*中不正确。它使逗号成为可选,因此它也可以匹配G,CC.*,匹配G,C,*匹配CC)。

这应该有效:

awk '$0 ~ /^[GCA](,[GCA])*$/ && /C/ {print $0}'

答案 1 :(得分:3)

请您尝试以下。

awk '!/CC/ && /^C,+.*|.*,C,*.*/'  Input_file

答案 2 :(得分:2)

$ awk '/(^|,)C(,|$)/' file
C,G
G,C
G,C,A

答案 3 :(得分:1)

我的猜测是也许这也行得通

awk '$0 ~ /^([A-Z],C,[A-Z]|[A-Z],C|C,[A-Z])$/ {print $0}'

Demo

建议

Mr. Rankin建议:

  

它等效于awk '/^([A-Z],C,[A-Z]|[A-Z],C|C,[A-Z])$/'。输出量   与print一起是默认操作,并且与   记录。

答案 4 :(得分:1)

更多替代方案

换句话说,您要选择以“ C”作为单词的行吗?如果是,这里有两种解决方案:

grep -w C
grep -E '\<C\>'

第一个建议grep仅匹配整个单词。第二行使用开始词和结束词模式。这些模式也可以与awk一起使用:

awk '/\<C\>/ {print}'

一个完整的不同解决方案(以及其他答案的形式也不同)是在比较,C,之前在两端添加逗号:

awk '"," $0 "," ~ /,C,/ {print}