使用 grep 查找两个字符串中的任何一个而不改变行的顺序?
Use grep to find either of two strings without changing the order of the lines?
我确定有人问过这个问题,但我找不到,所以很抱歉冗长。
我想使用 grep 或 egrep 查找其中包含“P”或“CA”的每一行,并将它们通过管道传输到新文件。我可以使用一个或另一个轻松地做到这一点:
egrep ' CA ' all.pdb > CA.pdb
或
egrep ' P ' all.pdb > P.pdb
我是正则表达式的新手,所以我不确定 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
|
表达式表示"or"。我们必须对其进行转义,以告诉 grep
它具有特殊含义。
您可以避免这种转义并使用带有扩展 grep
的更高级的东西:
grep -E ' (P|CA) ' file > new_file
总的来说,我更喜欢 awk
语法,因为它更清晰也更容易扩展:
awk '/ P / || / CA /' file
或者给定您的示例输入,您可以使用 awk
检查发生这种情况时它是否在第 3 列:
$ awk '=="CA" || =="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
下一个命令将搜索目录 /path_to_your_dir/
中存在的所有文件并将日志输出到 /tmp/grep.log
:
grep 'P|CA' -Er /path_to_your_dir/ > /tmp/grep.log
如果您需要不区分大小写,请将 -Er
替换为 -Eri
。
在文件 /tmp/grep.log
中,您将看到文件路径和匹配的字符串。
如果您需要在具有特定扩展名的文件中搜索,请写类似:
grep 'P|CA' -Er --include=*.php /path_to_your_dir/ > /tmp/grep.log
希望对您有所帮助。
我确定有人问过这个问题,但我找不到,所以很抱歉冗长。
我想使用 grep 或 egrep 查找其中包含“P”或“CA”的每一行,并将它们通过管道传输到新文件。我可以使用一个或另一个轻松地做到这一点:
egrep ' CA ' all.pdb > CA.pdb
或
egrep ' P ' all.pdb > P.pdb
我是正则表达式的新手,所以我不确定 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
|
表达式表示"or"。我们必须对其进行转义,以告诉 grep
它具有特殊含义。
您可以避免这种转义并使用带有扩展 grep
的更高级的东西:
grep -E ' (P|CA) ' file > new_file
总的来说,我更喜欢 awk
语法,因为它更清晰也更容易扩展:
awk '/ P / || / CA /' file
或者给定您的示例输入,您可以使用 awk
检查发生这种情况时它是否在第 3 列:
$ awk '=="CA" || =="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
下一个命令将搜索目录 /path_to_your_dir/
中存在的所有文件并将日志输出到 /tmp/grep.log
:
grep 'P|CA' -Er /path_to_your_dir/ > /tmp/grep.log
如果您需要不区分大小写,请将 -Er
替换为 -Eri
。
在文件 /tmp/grep.log
中,您将看到文件路径和匹配的字符串。
如果您需要在具有特定扩展名的文件中搜索,请写类似:
grep 'P|CA' -Er --include=*.php /path_to_your_dir/ > /tmp/grep.log
希望对您有所帮助。