根据分号拆分数据并选取唯一 ID

根据分号拆分数据并选取唯一 ID

我有一个如下文件:

26. ZINC19693599
27. ZINC19693598
28. AKOS032468089; ZINC575619353; F6561-5795 ...
29. MolPort-039-321-788; ZINC46759513; AKOS030658283
30. MolPort-039-315-229; AKOS030665655; ZINC108730091
31. MolPort-039-285-275; ZINC253426468; Z1983921961 ...
32. MolPort-039-260-085; ZINC293540464; Z2220694059 ...
33. MolPort-039-256-805; ZINC240871409; Z1978986809 ...
36. MolPort-042-618-243; AKOS026704656; ZINC575617472 ...
37. MolPort-042-617-677; AKOS026704258; ZINC575615033 ...
39. CHEMBL3446533; AKOS030350184; ZINC257247314
40. ZINC257240872
41. AKOS030286562; ZINC257302698
42. AKOS030286561; ZINC257339418
43. AKOS030262257; ZINC257197602
44. MolPort-038-977-160; ZINC225411464; Z1945656395 ...
45. MolPort-038-969-994; AKOS030642012; ZINC191511001
46. MolPort-035-834-516; ZINC170605844; Z366648930 ...
47. MolPort-035-834-509; ZINC170605825; Z366645258 ...
48. ZINC170591573
49. ZINC170591572
50. MolPort-038-956-852; ZINC135661620; Z1443333613 ...
51. MolPort-038-958-774; ZINC119501018; Z1542315705 ...
52. AKOS030442141; ZINC100744266; ZINC257344663
53. AKOS030406331; ZINC100216414; ZINC257287859
54. AKOS030389515; ZINC100159328; ZINC257263109 ...
55. AKOS030389402; ZINC100158990; ZINC257223925
56. AKOS030389401; ZINC100158986; ZINC257331241
57. ZINC97137184
58. ZINC97137179
59. ZINC96485930

每行都应该有ZINCID(它肯定以 开头ZINC,但 ID 的长度可能不一样)。我试图grep从每行中找出以 开头的 ID ZINC

我期望的结果如下所示:

ZINC19693599
ZINC19693598
ZINC575619353
ZINC46759513
ZINC108730091
ZINC253426468
ZINC240871409
..etc

有人可以帮忙吗?

答案1

首先grep,然后sort -u删除重复项,因此,根据你的文件格式,你可以这样做

grep -o 'ZINC[^;]*' infile |sort -u

正在匹配已跟随任何事物的ZINC[^;]*模式,直到看到并排除其自身。ZINC;;

答案2

你应该能够用 来做到这sed一点。类似这样的操作可能会起作用:

sed -En 's/^(.*; )?(ZINC[^;]+).*$/\2/p' < input.txt

它正在做的事情的简要概述:

  1. 告诉 sed 使用扩展正则表达式,并且默认不打印行。
  2. s/.../.../p语法告诉 sed 执行正则表达式s搜索并替换,然后打印匹配的线条。
  3. 正则表达式的第一部分^(.*; )?表示从行首开始匹配最多 a 个字符"; "(即,一定数量的分号分隔的项),或者根本不匹配任何字符(即,如果 ID 是第一个项)。
  4. (ZINC[^;]+)匹配您的 ZINC... ID,接受任何非分号字符作为 ID 的一部分。
  5. .*$匹配该行的剩余部分。
  6. 匹配的替换是\2,它是正则表达式中的第二个括号组(即 ZINC... ID)。由于正则表达式匹配整行,因此我们只剩下 ID。

如果格式如您所述,这可能就足够了。如果格式更复杂(例如有特殊的引用规则),您可能应该寻找一个可以理解格式的工具。

相关内容