【问题标题】:Awk for a string containing the special character "."awk 用于包含特殊字符“.”的字符串
【发布时间】:2018-01-16 13:42:18
【问题描述】:

这似乎是一个简单的问题,但我尝试了许多在其他问题中找到的方法,但都没有成功。

我只是尝试使用 awk 在 txt 文件的第 8 列中查找字符串 (ExAC_ALL=.),但是特殊字符“。”似乎引起了问题。

我尝试使用的代码是

> awk ' ($8 ~ "ExAC_ALL=.") {print $0}' input.txt > output.txt

我也试过了:

> EXAC="ExAC_ALL=." 
> awk -v NAME="$EXAC" '$8 ~ NAME { print $0 }' input.txt > output.txt

我也尝试过转义“。”符号多种方式。

任何建议将不胜感激。

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    只需使用单反斜杠来转义句点。

    例如,考虑这个输入文件:

    $ cat file
    ExAC_ALL=1
    ExAC_ALL=.
    ExAC_ALL=*
    

    要得到你想要的线条:

    $ awk '$1 ~ /ExAC_ALL=\./' file
    ExAC_ALL=.
    

    讨论

    没有反斜杠,句点是通配符:它匹配任何字符。因此:

    $ awk '$1 ~ /ExAC_ALL=./' file
    ExAC_ALL=1
    ExAC_ALL=.
    ExAC_ALL=*
    

    使用反斜杠,它只会匹配一个句点。

    另类

    或者,可以将句点放在方括号中:

    $ awk '$1 ~ /ExAC_ALL=[.]/' file
    ExAC_ALL=.
    

    【讨论】:

      【解决方案2】:

      你可以尝试如下

      $ EXAC="ExAC_ALL=[.]" 
      $ awk -v NAME="$EXAC" '$8 ~ NAME { print $0 }'  input.txt > output.txt
      

      【讨论】:

        【解决方案3】:

        对于固定字符串匹配,避免使用正则表达式并使用index - 如果未找到匹配,则返回匹配位置和0

        awk 'index($8, "ExAC_ALL=.")' ip.txt
        


        对于从 shell 传递字符串,使用环境变量而不是 -v 选项,这将防止反斜杠解释

        name="ExAC_ALL=." awk 'index($8, ENVIRON["name"])' ip.txt
        

        例如:

        $ echo 'a\b' | awk -v s='\b' 'index($1, s)'
        $ echo 'a\b' | s='\b' awk 'index($1, ENVIRON["s"])'
        a\b
        

        【讨论】:

          最近更新 更多