POSIXly и в локали C/POSIX вы должны быть в состоянии полагаться на ps -o etime
, предоставляя вам прошедшее время в формате, подобном [dd-]hh:mm:ss
. Таким образом, процессы, работающие не менее 6 часов, будут теми, в которых не -нулевая часть dd-
или когда часть hh
больше 06, поэтому:
LC_ALL=C ps -Ao etime,pid |
LC_ALL=C awk '$1 ~ /[1-9].*-|([1-9].|0[6-9]):..:/ {print $2}'
Будет сообщать идентификаторы процессов, запущенных более 6 часов.
Обратите внимание, что процесс может (и часто )выполняет более одной команды за время своего существования.
Ваш шаблон пытается сопоставить \
в начале строки, которого у вас нет:
$ echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.t1
Без попытки сопоставить \
в начале строки:
$ echo '>chr05_pilon_pilon.12.t1' | sed '/^>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.1
Возможно, вы также захотите разрешить X-, Y- и, возможно, М-хромосомы (в зависимости от того, что содержит сборка вашего генома):
echo '>chr05_pilon_pilon.12.t1' | sed -E '/^>chr([0-9][0-9]|[XYM])_pilon_pilon/ s/(.*)t/\1/'
Также обратите внимание, что /g
не требуется.
Всякий раз, когда вы работаете с регулярными выражениями, вы должны помнить, что «меньше значит больше». Я имею в виду, что вы всегда должны пытаться использовать шаблон самый простой и самый короткий , который соответствует вашим данным. Не пытайтесь сопоставить все, выбирайте только ту часть, которая вам действительно нужна.
В этом случае у вас есть >chr05_pilon_pilon.12.t1
, и все, что вам нужно сделать, это удалить последний t
после последнего .
. Так что не пытайтесь сопоставлять с самого начала, вас это не волнует, и это только усложнит ваше регулярное выражение и сделает его более неправильным, как вы это сделали. Вот несколько альтернатив,в зависимости от того, что вам действительно нужно:
Удалить все не -числовые символы после последнего .
в строках, начинающихся с >
:
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)\.[^0-9]*/\1./'
>chr05_pilon_pilon.12.1
Удалить последние t
в строках, начинающихся с >
:
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)t/\1/'
>chr05_pilon_pilon.12.1
То же, что и выше, но только если t
находится сразу после.
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*\.)t/\1/'
>chr05_pilon_pilon.12.1
Удалить последнее t
, которое следует за .
, но только в строках, начинающихся с >
, затем chr
, за которыми следуют ровно два числа иpilon_pilon
:
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>chr[0-9][0-9]_pilon_pilon.*\.)t/\1/'
>chr05_pilon_pilon.12.1
Наконец, предполагая, что у вас также могут быть хромосомы X
, Y
и M
или MT
, вы можете расширить описанное выше, чтобы оно соответствовало и им
$ printf '>chrX_pilon_pilon.12.t1\n>chr05_pilon_pilon.12.t1\n>chrMT_pilon_pilon.12.t1\n' |
sed -E 's/^(>chr([0-9XYM]{1,2}|MT)_pilon_pilon.*\.)t/\1/'
>chrX_pilon_pilon.12.1
>chr05_pilon_pilon.12.1
>chrMT_pilon_pilon.12.1
Эта команда ниже поможет вам получить желаемый результат
#!/bin/bash
echo '>chr05_pilon_pilon.12.t1' | sed 's/.t/./'
Выход:
>chr05_pilon_pilon.12.1