我确定有人问过这个问题,但我找不到它,所以我为冗余道歉。
我想使用 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/