使用 grep 获取特定行

get specific lines with grep

我想解析这样的文本:

# cmd: Text_finder --outdir 1
# No Text found
# cmd: Text_finder --outdir 2
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No
Text_01 tt  002 454 517 1   1.9e-05     No
Text_01 tt_c7   003 1276    1362    1   2.2e-08     No
# cmd: Text_finder --outdir 3
# No Text found
# cmd: Text_finder --outdir 4
# No Text found
# cmd: Text_finder --outdir 5
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No

为了检索以“Text_01”(结果)、“ID_Text”(标题)开头的行以及“ID_Text”之前的行(以“#cmd”开头:"但也很常见,没有结果我想下车)。

我尝试合并并执行这些行:

#get lines with "ID_text" and "text_01"
grep -P "ID_text|text_01" result.txt > positive-results.txt;

#get line before line with "ID_text" 
grep -B1 "ID_text" result.txt > positive-results.txt;

但我无法获得这样的文件:

# cmd: Text_finder --outdir 2
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No
Text_01 tt  002 454 517 1   1.9e-05     No
Text_01 tt_c7   003 1276    1362    1   2.2e-08     No
# cmd: Text_finder --outdir 5
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No

你有聪明的方法吗?

非常感谢

$ grep --no-group-separator -B 1 "^\(Text_01\|ID_Text\)" file

输出:

# cmd: Text_finder --outdir 2
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No
Text_01 tt  002 454 517 1   1.9e-05     No
Text_01 tt_c7   003 1276    1362    1   2.2e-08     No
# cmd: Text_finder --outdir 5
ID_Text ID element  pos_beg pos_end model   type    default distance
Text_01 tt  001 38  108 1   6.3e-05     No

man grep:

-B NUM, --before-context=NUM
          Print NUM  lines  of  leading  context  before  matching  lines.
          Places   a  line  containing  a  group  separator  (--)  between
          contiguous groups of matches.

有趣的是,我的手册页没有对 --no-group-separator 的解释,但在没有它的情况下尝试上面一次,你就会看到。