【问题标题】:how to extract text between two delimiters when string is present存在字符串时如何在两个分隔符之间提取文本
【发布时间】:2018-06-20 17:34:24
【问题描述】:

我有一个大数据文件,如下所示:

//
ID   1.1.1.258
DE   6-hydroxyhexanoate dehydrogenase.
CA   6-hydroxyhexanoate + NAD(+) = 6-oxohexanoate + NADH.
CC   -!- Involved in the cyclohexanol degradation pathway in Acinetobacter
CC       NCIB 9871.
//
ID   1.1.1.259
DE   3-hydroxypimeloyl-CoA dehydrogenase.
CA   3-hydroxypimeloyl-CoA + NAD(+) = 3-oxopimeloyl-CoA + NADH.
CC   -!- Involved in the anaerobic pathway of benzoate degradation in
CC       bacteria.
//
ID   1.1.1.260
DE   Sulcatone reductase.
CA   Sulcatol + NAD(+) = sulcatone + NADH.
CC   -!- Studies on the effects of growth-stage and nutrient supply on the
CC       stereochemistry of sulcatone reduction in Clostridia pasteurianum,
CC       C.tyrobutyricum and Lactobacillus brevis suggest that there may be at
CC       least two sulcatone reductases with different stereospecificities.
//

我想提取此文件中包含作品 anaerobic 的部分。我特别想要ID行。

有没有办法在 ID 和 // 之间搜索文件以找到 anaerobic 并将输出打印到新文件?如果整个部分都被打印出来,那很好,我想我可以在之后把它弄出来。

预期应该是

ID   1.1.1.259

ID   1.1.1.259
DE   3-hydroxypimeloyl-CoA dehydrogenase.
CA   3-hydroxypimeloyl-CoA + NAD(+) = 3-oxopimeloyl-CoA + NADH.
CC   -!- Involved in the anaerobic pathway of benzoate degradation in
CC       bacteria.
//

【问题讨论】:

  • 请显示预期的输出和到目前为止完成的工作?

标签: bash text-parsing


【解决方案1】:

tac file | sed -n '/anaerobic/,$p' | sed -n '/^ID/ {p;q}'

  • tac **file**:从头到尾打印文件
  • sed -n '/anaerobic/,$p':从第一次出现厌氧打印到文件末尾
  • sed -n '/^ID/ {p;q}':搜索以id开头的一行, 只打印第一次出现

【讨论】:

  • 这将只打印一次。可以有多个部分包含anaerobic
【解决方案2】:

awk 很简单

awk '/anaerobic/' RS='//\n' ORS='\n//' ./file.txt

【讨论】:

  • 非常感谢。我可以从这里获取 ID 行。
  • 请注意,多字符 RS 是 GNU awk 特定的.. 仅获取 id,awk -F'\n' -v RS='//' '/anaerobic/{print $1}'
【解决方案3】:

对于品种,可能的GNU sed解决方案:

sed -nr ':a; \@(^|\n)//$@! { N; ba }; /anaerobic/p' data

  • -n => 禁止自动打印模式空间
  • -r => 扩展正则表达式
  • :a => 标签的定义
  • ba => 跳转到标签a
  • N => 将下一行追加到模式空间
  • \@(^|\n)//$@! => 匹配不以 // 结尾的“部分”

\@(^|\n)//$@! { N; ba } 因此将下一行附加到模式空间,直到找到// 部分分隔符。 /anaerobic/p 然后检查当前部分是否包含anaerobic,如果包含,pcommand 会打印它。

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2020-04-19
    • 2016-02-10
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2020-05-20
    • 2019-04-05
    相关资源
    最近更新 更多