Разделение данных на основе полу двоеточия и взятие уникальных идентификаторов

У меня есть файл, который похож на это:

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

Каждая строка должна иметь ZINC Идентификатор (это, конечно, запускается с ZINC, но длина идентификатора не могла бы быть тем же). Я пытаюсь grep от каждой строки этот идентификатор, который запускается с ZINC.

В моем результате я ожидал бы иметь что-то, что похоже на это:

ZINC19693599
ZINC19693598
ZINC575619353
ZINC46759513
ZINC108730091
ZINC253426468
ZINC240871409
..etc

Кто-либо может помочь, как сделать это?

0
задан 4 September 2018 в 22:20

2 ответа

сначала grep затем sort -u удалить дубликаты, таким образом, на основе Вашего формата файла, можно сделать

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

ZINC[^;]* соответствует наличию шаблонов ZINC сопровождаемый чем-либо до ; замеченный и исключенный ; самостоятельно.

1
ответ дан 28 October 2019 в 00:57

Необходимо смочь сделать это с sed. Что-то вроде этого могло бы сделать:

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

Краткое краткое изложение того, что это делает:

  1. скажите sed использовать расширенные регулярные выражения и не строки печати по умолчанию.
  2. s/.../.../p синтаксис говорит sed выполнять поиск regexp и замену, затем печатать согласующие отрезки длинной линии.
  3. Первая часть regexp ^(.*; )? говорит для запуска в начале строки любого матча любые символы до a "; " (т.е. некоторое количество точки с запятой разграничило объекты), или ничто вообще (т.е. если идентификатор является первым объектом).
  4. (ZINC[^;]+) соответствует Вашему ЦИНКУ... Идентификатор, принимая любой символ неточки с запятой как часть идентификатора.
  5. .*$ соответствует остатку от строки.
  6. Замена для соответствия \2, который является второй заключенной в скобки группой в регулярном выражении (т.е. ЦИНК... Идентификатор). Так как regexp соответствует всей строке, нас оставляют только с идентификатором.

Если формат - как Вы описали, это, достаточно вероятно. Если это более сложно (например, со специальными правилами заключения в кавычки), необходимо, вероятно, искать инструмент, который понимает формат.

1
ответ дан 28 October 2019 в 00:57

Другие вопросы по тегам:

Похожие вопросы: