如何通过给定的两个文件检索特定单词之间的行?

Posted

技术标签:

【中文标题】如何通过给定的两个文件检索特定单词之间的行?【英文标题】:how to retreive lines between specific words by given two files? 【发布时间】:2020-02-23 11:53:11 【问题描述】:

我有两个文件 1 和 2。文件 1 包含以 C 和 D 开头的代谢途径的所有详细信息,其中包含大量 C 和 D,而文件 2 仅包含名称以开头的特定 ID 行C 并且具有唯一性(入围 C,数量较少)。文件如下所示:

文件 1:

C    00010 Glycolysis / Gluconeogenesis [PATH:smup00010]
D      SMPSPU_277 pfkA; 6-phosphofructokinase   K00850 pfkA; 6-phosphofructokinase 1 [EC:2.7.1.11]
D      SMPSPU_278 gapA; glyceraldehyde 3-phosphate dehydrogenase        K00134 GAPDH; glyceraldehyde 3-phosphate dehydrogenase [EC:1.2.1.12]
D      SMPSPU_274 acoA; pyruvate dehydrogenase E1 component subunit 
alpha       K00161 PDHA; pyruvate dehydrogenase E1 component alpha subunit 
[EC:1.2.4.1]
D      SMPSPU_172 korA; 2-oxoglutarate ferredoxin oxidoreductase subunit alpha  K00174 korA; 2-oxoglutarate/2-oxoacid ferredoxin oxidoreductase subunit alpha [EC:1.2.7.3 1.2.7.11]
D      SMPSPU_061 korB; 2-oxoglutarate ferredoxin oxidoreductase subunit beta   K00175 korB; 2-oxoglutarate/2-oxoacid ferredoxin oxidoreductase subunit beta [EC:1.2.7.3 1.2.7.11]
C    00020 Citrate cycle (TCA cycle) [PATH:smup00020]
D      SMPSPU_201 sucA; 2-oxoglutarate dehydrogenase, E1 component      K00164 OGDH; 2-oxoglutarate dehydrogenase E1 component [EC:1.2.4.2]
D      SMPSPU_120 lpdA; dihydrolipoamide dehydrogenase  K00382 DLD; dihydrolipoamide dehydrogenase [EC:1.8.1.4]
D      SMPSPU_172 korA; 2-oxoglutarate ferredoxin oxidoreductase subunit alpha  K00174 korA; 2-oxoglutarate/2-oxoacid ferredoxin oxidoreductase subunit alpha [EC:1.2.7.3 1.2.7.11]
D      SMPSPU_169 sucD; succinyl-CoA synthetase subunit alpha   K01902 sucD; succinyl-CoA synthetase alpha subunit [EC:6.2.1.5]
D      SMPSPU_229 pdhB; pyruvate dehydrogenase E1 component subunit beta        K00162 PDHB; pyruvate dehydrogenase E1 component beta subunit [EC:1.2.4.1]
D      SMPSPU_275 pdhC; dihydrolipoamide acyltransferase E2 component   K00627 DLAT; pyruvate dehydrogenase E2 component (dihydrolipoamide acetyltransferase) [EC:2.3.1.12]
C    00030 Pentose phosphate pathway [PATH:smup00030]
D      SMPSPU_057 tktB; transketolase, N-terminal subunit       K00615 E2.2.1.1; transketolase [EC:2.2.1.1]
D      SMPSPU_058 tktA; transketolase, C-terminal subunit       K00615 E2.2.1.1; transketolase [EC:2.2.1.1]
C    00051 Fructose and mannose metabolism [PATH:smup00051]
D      SMPSPU_277 pfkA; 6-phosphofructokinase   K00850 pfkA; 6-phosphofructokinase 1 [EC:2.7.1.11]
D      SMPSPU_230 fbaA; fructose-bisphosphate aldolase  K01624 FBA; fructose-bisphosphate aldolase, class II [EC:4.1.2.13]

文件 2:

C    00261 Monobactam biosynthesis [PATH:smup00261]
C    00300 Lysine biosynthesis [PATH:smup00300]
C    00660 C5-Branched dibasic acid metabolism [PATH:smup00660]
C    00680 Methane metabolism [PATH:smup00680]
C    02020 Two-component system [PATH:smup02020]
C    02024 Quorum sensing [PATH:smup02024]

现在我只想提取文件 2 中存在的那些 C 和它们各自的 D。

我试过这个脚本

fgrep -f name-C-non-homowba00001 wba00001.keg |grep -E '^C.*PATH|^D' | less

但我给了我这个 C id 和名称文件。

【问题讨论】:

为什么这会被标记为python 问题? 欢迎来到 SO。很好,您已经展示了您尝试解决问题的方法。您能否编辑您的帖子,以简洁明了的方式添加输入示例和预期输出示例,以便我们更好地理解问题。 你试过了吗?请编辑您的帖子以添加您已经编写的代码! 您添加字母ABCD 是为了解释吗?如果是,请说明这一点,并以原始格式添加准确的输入。如果输入包含多于一组的行,请显示带有几组的更长示例输入。否则,不清楚最后 D 行后面是什么。如果有几个组,你想要所有的 C 行和 D 行吗?还是只有一个特定的群体?您的 C 行中的单词/字段数是否始终相同?如何区分 C 行和 D 行?缩进?第一个字段的格式?请在问题中添加所有说明 @F.Hauri 我编写了代码,但是当我编辑我的帖子并保存它时,它开始出现错误。我认为它的格式问题。我第一次使用这个网站。我尝试了很多,但问题没有解决,所以我删除了它。 【参考方案1】:

试试这个:

cat input | grep -E '^[CD]' | sed -n '/^C.*PATH/,/^C/p' | uniq -f2 | grep -E '^C.*PATH|^D'

地点:

input 是你的文件 first grep 打印所有以 C 或 D 开头的行 sed 打印从以 C 开头并包含 PATH 的所有行到以 C 开头的下一行(包括) uniq 抑制所有相等的相邻行,除了前 2 个字段 last grep 打印所有以 C 开头并包含 PATH 或以 D 开头的行

【讨论】:

C 02060 磷酸转移酶系统 (PTS) [PATH:msu02060] C 03070 细菌分泌系统 [PATH:msu03070] D MS1563 secD; SecD 蛋白 K03072 secD;前蛋白转位酶亚基 SecD D MS1564 secF; SecF 蛋白 K03074 secF;前蛋白转位酶亚基 SecF D MS0204 secE; SecE 蛋白 K03073 secE; preprotein translocase subunit SecE 通过使用这个脚本,我得到了两个连续的C行,这意味着它没有提供第一个C的D行 通过添加 [D] 和 sed -n '/^C.*PATH/,/^C[D]/p' 解决了【参考方案2】:
awk '$1!~/^D$/  select=0;  $1=="C" && $NF~/PATH/  select=1;  if(select) print; ' inputfile

解释:

$1!~/^D$/ select=0; D 以外的行停止输出。$1=="C" && $NF~/PATH/ select=1; 在最后一个字段中包含PATHC 行开始输出。if(select) print; 如果选中则打印当前行用于输出。

【讨论】:

【参考方案3】:

这是一种安全的方法:

awk '(NR==FNR)a[$0];next/^C/p=($0 in a)p' file2 file1

【讨论】:

以上是关于如何通过给定的两个文件检索特定单词之间的行?的主要内容,如果未能解决你的问题,请参考以下文章

在 txt 文件中的不同列中取两个特定值之间的行 [关闭]

如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行

获取php中两个特定字符之间的单词

如何在两个相同的标记模式之间获取特定数据

替换两个特定单词之间的某个值

抓取两个日期时间之间的行并避免迭代