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

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

У меня есть длинный текстовый файл, частичное содержимое файла показано ниже,

[{"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"},

Мне нужно проанализировать uniprotидентификаторы из приведенного выше текстового файла, и ожидаемый результат приведен ниже:

P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

Чтобы сделать то же самое, я попробовал следующие команды, но ничего не помогло:

sed -e 's/"uniprot":"\(.*\)"},{"site":"/\1/' file.txt
cat file.txt | sed 's/.*"uniprot":" //' | sed 's/"site":".*$//'

Пожалуйста, помогите мне разобрать идентификаторы, как указано выше.

Заранее спасибо.

решение1

Если вы используете систему Linux, вы можете очень легко сделать следующее:

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

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


Конечно, это выглядит как данные 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

решение2

Если вы внимательно заметили, ваш входной файл — это структура данных 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

решение3

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

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

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

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

решение4

Решение Perl 5

$ perl -nle 'print join"\n",m/uniprot\":\"(.*?)\"/g' file.txt
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
$

Связанный контент