这似乎是一个简单的问题,但我尝试了其他一些问题但我没有运气的方法。
我只是试图使用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
我也试过逃避"。"符号多种方式。
任何建议都将不胜感激。
答案 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