Проблема с использованием обратной ссылки sed

#!/bin/bash
pid=$(ps -eo %cpu,pid --sort -%cpu | head -n 2 | awk '{print $1 " " $2}')
if [[ -n $pid ]]; then
    kcpu=$(echo $pid | awk '{print $3}')
    kpid=$(echo $pid | awk '{print $4}')
    ift=$(echo "90"'<'$kcpu | bc -l)
    if [ $ift -eq "0" ]; then
        echo "kpid = $kpid"
        kill $kpid
    fi
else
echo "Does not exist"
fi
4
22.09.2019, 10:06
1 ответ

Основная проблема в том, что вы сбежали >и |, и я подозреваю, что вы используете GNU sed. В этом случае \>действует как конец границы слова, а \|— как оператор чередования.

$ sed 's/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1

Измененная команда показана выше. Кроме того, кажется, что в конце строки есть пробелы, поэтому я добавил .*, чтобы удалить их. Используйте sed -n '/NC_/ s/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/p', чтобы включить операцию grepв сам sed

.


Вы также можете использоватьawk

$ awk -F'|' '/NC_/{print ">" $2}' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
  • -F'|', чтобы определить |как разделитель полей. |является оператором регулярного выражения, но когдаFS(специальная переменная awk разделителя полей, установленная -F), является одним символом, она не рассматривается как регулярное выражение. -F'[|]'или -F'\\|'также будут работать, но менее эффективны.
  • /NC_/, если строка ввода содержит NC_
    • print ">" $2напечатать >символ и второе поле
4
27.01.2020, 20:54

Теги

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