awk包含特殊字符的字符串"。"

时间:2018-01-16 04:16:20

标签: unix awk

这似乎是一个简单的问题,但我尝试了其他一些问题但我没有运气的方法。

我只是试图使用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

我也试过逃避"。"符号多种方式。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用单反斜杠来逃避这段时间。

例如,请考虑此输入文件:

$ 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=.

答案 1 :(得分:1)

您可以尝试以下

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

答案 2 :(得分:0)

用于固定字符串匹配,避免使用正则表达式并使用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