Полный ответ:
Если я поставлю tmux <...>
в подкоманду, я могу оставить ssh-agent tmux
в выводе ps aux | grep agent
, но теперь ssh-agent tmux
работает в subshell
, который не завершится после того, как сервер будет убит.
РЕДАКТИРОВАТЬ для полного ответа :Я передал -d
, чтобы отсоединить при передаче параметров в tmux
, чтобы убить процесс ssh-agent
.
Если вы внимательно заметили, ваш входной файл представляет собой структуру данных 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
Если вы работаете в системе 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
Это подойдет для вашего примера (с grep и sed):
grep -o '"uniprot":"[^"]*"' your_file | sed 's/.*:"\(.*\)"/\1/'
Это работает следующим образом:
Сначала мы печатаем o
nly -совпадающие части поиска grep, чтобы получить:
"uniprot":"P12807"
"uniprot":"P12807"
"uniprot":"T12807"
"uniprot":"P12808"
"uniprot":"Z12809"
"uniprot":"P12821"
"uniprot":"P0C918"
Затем мы передаем это в sed и используем группу захвата, чтобы запомнить материал в последнюю строку и замените каждую строку только этой строкой, чтобы получить:
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
Использованиеgawk
:
awk 'BEGIN{RS=","}
/uniprot/{print gensub(/.*("uniprot":")(.*)".*/, "\\2", "g") }' input
В этой команде в качестве разделителя записи(RS
)используется запятая.
Затем gawk
встроенный -в функцию gensub()
заменяет строку желаемым шаблоном, используя обратную ссылку(\\2
).
Использование 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
Кратко:
comb
используется для выделения фигурных -фигурных скобок, comb
снова используется для выделения элементов в двойных -кавычках, \n
и возвращаются(.put
). Важно отметить, что приведенный выше код по-прежнему работает, даже если jq
, jq -r
или jq -c
выполняются во входном файле перед передачей в Raku. Наконец, я попытался максимально убрать символы кавычек, чтобы повысить переносимость.