![如何将匹配限制为记录列中的特定字符串?](https://linux22.com/image/146990/%E5%A6%82%E4%BD%95%E5%B0%86%E5%8C%B9%E9%85%8D%E9%99%90%E5%88%B6%E4%B8%BA%E8%AE%B0%E5%BD%95%E5%88%97%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我有一个 2000 行的文件,其中包含以下结果:
> HGNC:24239 | 2 | deleterious_low_confidence(0.01)
> HGNC:6583 | 1 | deleterious(0.04)
我想得到那些线有害的()不是有害的_低_置信度()。我使用了这个命令但没有用:
awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt
谁能告诉我我的命令有什么问题吗?谢谢!
答案1
大约有三件事让你下命令,
awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt
没有按预期工作:
数据中的输入字段分隔符是
|
。默认分隔符(您正在使用的)是空格或制表符的任意集合。这意味着这$3
将是|
每行的第一个字符。NR==1
无论如何,您的代码位都会导致第一行被打印。您使用的正则表达式包含表达式错误。
(
和)
在扩展正则表达式中比较特殊,需要转义。但是deleterious\(*\)
也不能匹配\(*
“任意数量的(
字符”。
要正确用作|
输入字段分隔符,请使用awk
with -F '|'
。但在这种情况下,您可能希望使用[[:blank:]]*\\|[[:blank:]]*
它来使其还包含管道符号周围的侧翼空格/制表符(如果有)。需要前面的反斜杠|
使其成为文字管道符号(如果字段分隔符长于单个字符,则将其视为正则表达式,并|
在正则表达式中进行交替)。该表达式也可以像 中的文字[[:blank:]]*[|][[:blank:]]*
一样工作。|
[...]
为了匹配第三个字段,deleterious(<anything>)
我们可以使用表达式^deleterious\(.*\)$
。括号也需要转义,因为它们在正则表达式中很特殊。或者,^deleterious[(].*[)]$
可以使用。
这意味着您将使用
awk -F '[[:blank:]]*[|][[:blank:]]*' '$3 ~ /^deleterious\(.*\)$/' file1.txt >file2.txt
根据给定的数据,这将产生
> HGNC:6583 | 1 | deleterious(0.04)
在file2.txt
。
与一个单身的 |
作为字段分隔符,您可以使用
awk -F '|' '$3 ~ /^[[:blank:]]*deleterious\(.*\)$/' file1.txt >file2.txt
这样就允许在第三个字段的开头存在空格或制表符。
答案2
我会推荐fgrep
:
fgrep 'deleterious(' file1.txt > file2.txt
如果你想使用awk
,你需要一个合适的正则表达式:
awk -F '|' '$3 ~ /^ deleterious\(.*\)$/' file1.txt > file2.txt
或者
awk -F ' \| ' '$3 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt
或者
awk '$6 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt