regex - 使用 grep 查找两个字符串中的任何一个而不更改行的顺序?

标签 regex grep protein-database

我确定有人问过这个问题,但我找不到它,所以我为冗余道歉。

我想使用 grep 或 egrep 来查找包含“P ”或“CA ”的每一行,并将它们通过管道传输到一个新文件。我可以轻松地使用其中一种方法来完成:

egrep ' CA ' all.pdb > CA.pdb

或者
egrep ' P ' all.pdb > P.pdb

我是 regex 的新手,所以我不确定 or 的语法.

更新:
输出行的顺序很重要,即我不希望输出按照它匹配的字符串对行进行排序。下面是一个文件前 8 行的示例:
ATOM      1 N    THR U  27     -68.535  88.128 -17.857  1.00  0.00      1H5  N  
ATOM      2 HT1  THR U  27     -69.437  88.216 -17.434  0.00  0.00      1H5  H  
ATOM      3 HT2  THR U  27     -68.270  87.165 -17.902  0.00  0.00      1H5  H  
ATOM      4 HT3  THR U  27     -68.551  88.520 -18.777  0.00  0.00      1H5  H  
ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM      8 HB   THR U  27     -68.543  88.566 -15.171  0.00  0.00      1H5  H  
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM     11 HB   THR U  27     -68.543  88.566 -15.171  0.00  0.00      1H5  H  
ATOM     12 C    SER D   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 C  
ATOM     13 OP1  SER D   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 O  

我希望这个例子的结果文件是:
ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  

最佳答案

您可以使用 grep像这样:

grep ' P \| CA ' file > new_file
|表达式表示“或”。我们必须逃脱它才能告诉 grep它有特殊的意义。

您可以通过扩展 grep 避免这种转义并使用更高级的东西。 :
grep -E ' (P|CA) ' file > new_file

总的来说,我更喜欢 awk语法,因为它更清晰,更容易扩展:
awk '/ P / || / CA /' file

或者根据您的样本输入,您可以使用 awk发生这种情况时检查它是否在第 3 列中:
$ awk '$3=="CA" || $3=="P"' file
ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P

测试
$ cat file
hello P is here and CA also
but CA appears
nothing here
P CA
$ grep ' P \| CA ' file
hello P is here and CA also
but CA appears
$ grep -E ' (P|CA) ' file
hello P is here and CA also
but CA appears
$ awk '/ P / || / CA /' file
hello P is here and CA also
but CA appears

关于regex - 使用 grep 查找两个字符串中的任何一个而不更改行的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30530034/

相关文章:

grep - 如何避免lookbehind断言不是固定长度

python - Biopython:如何避免蛋白质中的特定氨基酸序列以绘制 Ramachandran 图?

python - 从 pandas 数据框列中获取括号周围的文本并将输出复制到同一列

javascript - 如何使用正则表达式获取特定字符后的所有字符,例如逗号 (",")

python - 将空格分隔的元素拆分为单独的行

shell - shell脚本中如何获取包含关键字的段落?

python - 如何相对于引用系移动蛋白质坐标

python - 如何在pdb中添加链ID

javascript - 正则表达式仅引用字符串匹配(而不是数字)

php - 用于精确匹配一个或两个单词的 mysql 正则表达式