如何将匹配限制为记录列中的特定字符串?

如何将匹配限制为记录列中的特定字符串?

我有一个 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

没有按预期工作:

  1. 数据中的输入字段分隔符是|。默认分隔符(您正在使用的)是空格或制表符的任意集合。这意味着这$3将是|每行的第一个字符。

  2. NR==1无论如何,您的代码位都会导致第一行被打印。

  3. 您使用的正则表达式包含表达式错误。 ()在扩展正则表达式中比较特殊,需要转义。但是deleterious\(*\)也不能匹配\(*“任意数量的(字符”。

要正确用作|输入字段分隔符,请使用awkwith -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

相关内容