Как разобрать определенные идентификаторы из текстового файла?

Полный ответ:

Если я поставлю tmux <...>в подкоманду, я могу оставить ssh-agent tmuxв выводе ps aux | grep agent, но теперь ssh-agent tmuxработает в subshell, который не завершится после того, как сервер будет убит.

РЕДАКТИРОВАТЬ для полного ответа :Я передал -d, чтобы отсоединить при передаче параметров в tmux, чтобы убить процесс ssh-agent.

1
15.06.2021, 14:09
5 ответов

Если вы внимательно заметили, ваш входной файл представляет собой структуру данных Python. В частности, это список словарей. Нам нужно добавить закрывающую квадратную скобку.

С помощью модуля ast мы можем сериализовать строку, которая является допустимой структурой данных Python.

python3 -c 'import sys, ast
ifile,key = sys.argv[1:]
str = ""
with open(ifile) as fh:
  for l in fh: str += l.rstrip()
  lod = ast.literal_eval(str)
  for d in lod: print(d[key])
' file uniprot

P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
1
28.07.2021, 11:24

Если вы работаете в системе Linux, вы можете легко:

$ grep -oP '"uniprot":"\K[^"]+' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

-oуказывает grepпечатать только совпадающую часть каждой строки, а -Pвключает Perl-совместимые регулярные выражения. Регулярное выражение ищет "uniprot":", но затем отбрасывает его (\Kозначает «отбросить все совпавшие до сих пор», поэтому оно не включается в вывод ). Затем вы просто ищете самый длинный отрезок non-"([^"]+).


Конечно, это похоже на данные JSON, поэтому для чего-то более сложного вам следует использовать подходящий синтаксический анализатор, например jq. Если вы исправите свой файл, добавив закрывающий ]и сделав его таким:

[{"site":"1a2v_1","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_2","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_3","pfam":"Cu_amine_oxid","uniprot":"T12807"},{"site":"1a2v_4","pfam":"Cu_amine_oxid","uniprot":"P12808"},{"site":"1a2v_5","pfam":"Cu_amine_oxid","uniprot":"Z12809"},{"site":"1a2v_6","pfam":"Cu_amine_oxid","uniprot":"P12821"},{"site":"1a3z_1","pfam":"Copper-bind,SoxE","uniprot":"P0C918"}]

Можно:

$ jq -r '.[].uniprot' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
12
28.07.2021, 11:24

Это подойдет для вашего примера (с grep и sed):

grep -o '"uniprot":"[^"]*"' your_file | sed 's/.*:"\(.*\)"/\1/'

Это работает следующим образом:

  • Сначала мы печатаем only -совпадающие части поиска grep, чтобы получить:

    "uniprot":"P12807"
    "uniprot":"P12807"
    "uniprot":"T12807"
    "uniprot":"P12808"
    "uniprot":"Z12809"
    "uniprot":"P12821"
    "uniprot":"P0C918"
    
  • Затем мы передаем это в sed и используем группу захвата, чтобы запомнить материал в последнюю строку и замените каждую строку только этой строкой, чтобы получить:

    P12807
    P12807
    T12807
    P12808
    Z12809
    P12821
    P0C918
    
2
28.07.2021, 11:24

Использованиеgawk:

awk 'BEGIN{RS=","}
/uniprot/{print gensub(/.*("uniprot":")(.*)".*/, "\\2", "g") }' input

В этой команде в качестве разделителя записи(RS)используется запятая.

Затем gawkвстроенный -в функцию gensub()заменяет строку желаемым шаблоном, используя обратную ссылку(\\2).

2
28.07.2021, 11:24

Использование Raku (, ранее известного как Perl _6)

cat uniprot_file.txt | raku -e 'slurp.comb( / <[{]>~<[}]>.+? / ).comb( / <["]>~<["]>.+? / ).map( *.subst: Q["], Q[], :g ).[ 5, { $_ + 6 }...* ].join( Q:b[\n] ).put;'
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

Кратко:

  1. файл хлюпает в Раку,
  2. combиспользуется для выделения фигурных -фигурных скобок,
  3. combснова используется для выделения элементов в двойных -кавычках,
  4. в выделенных элементах убраны двойные -кавычки,
  5. индекс, начинающийся с 0, генерируется с учетом каждого шестого элемента (, т.е. uniprot _ID )и
  6. uniprot _Идентификаторы объединяются \nи возвращаются(.put).

Важно отметить, что приведенный выше код по-прежнему работает, даже если jq, jq -rили jq -cвыполняются во входном файле перед передачей в Raku. Наконец, я попытался максимально убрать символы кавычек, чтобы повысить переносимость.

https://raku.org/

1
28.07.2021, 11:24

Теги

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