В идеале, поскольку данные представлены в формате GTF, для их анализа следует использовать синтаксический анализатор GTF. В настоящее время у меня нет такого синтаксического анализатора или библиотеки синтаксического анализа, поэтому мое решение основано исключительно на данных, которые вы предоставили в вопросе.
Чтобы извлечь 9-й столбец:
$ cut -f 9 data.gtf
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.028725"; FPKM "0.053510"; TPM "0.109957";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.014218";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "2"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.072139";
Чтобы получить из этого данные, которые нам нужны, нам нужно обрабатывать транскрипты и экзоны отдельно, поскольку их атрибуты имеют разный порядок в данных. Мы делаем это с помощью awk
и выводим разные поля во входных данных в зависимости от того, содержит ли текущая строка строку exon_number
или нет:
$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }'
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
Затем мы удаляем двойные кавычки и точки с запятой из этого:
$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }' | tr -d '";'
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
Этого можно добиться, подражая тому, что делает nohup
во второй части вашего скрипта.
Команда nohup
не делает больше, чем:
Перенаправить стандартные файловые дескрипторы, чтобы скрипт не пытался читать или писать в терминал.
Перехватить сигнал SIGHUP и игнорировать его. SIGHUP — это то, что получает процесс, когда его управляющий терминал закрыт. Если его игнорировать, процесс продолжит работу после закрытия его терминала.
Этого можно добиться с помощью следующего скрипта:
echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input
(
trap '' 1 # Ignore SIGHUP
# Series of long running commands
# using $low, $high and $input
) </dev/null >myscript.log 2>&1 &
Последняя строка перенаправит stdin из /dev/null и из stdout и stderr вmyscript.log
(вы можете выбрать лучшее имя файла и, возможно, использовать метку времени или что-то подобное, чтобы сделать его уникальным.)
Наконец, вы переводите весь процесс в фоновый режим с помощью final &
.
Еще одна возможность состоит в том, чтобы разделить ваш скрипт на две части, чтобы второй принимал low
, high
и input
в качестве аргументов строки команды -или, возможно, в качестве экспортированных переменных среды, а затем запускал второй часть с использованием фактической команды nohup
. Это должно быть проще и несколько гибче, поскольку вы можете запускать сценарий выполнения второй части без необходимости иметь дело с интерактивными подсказками.
Другой возможностью является использование терминальных мультиплексоров, таких как tmux
или screen
, чтобы вы могли повторно подключиться к сеансу, если вы отключились (или вы можете отключить его самостоятельно ), также вы можете открыть новое окно для запуска новой оболочки, в то время как ваш скрипт продолжает работать в исходном окне. Независимо от того, реализуете ли вы одно из приведенных выше решений, использование tmux
или screen
было бы хорошей идеей, так что попробуйте, если сможете.
Вы можете заключить длинную последовательность команд в фигурные скобки, а затем использовать & для продолжения без ожидания.
echo "Read input"
{
# all your commands in curly braces
#...
} & exit 0
Затем вы можете выйти, не дожидаясь завершения всех ваших команд. Он должен продолжать работать, даже если вы отключитесь от сервера.