Создайте переменную из двух подстрок другой переменной в bash - PullRequest
0 голосов
/ 31 января 2019

Вот скрипт, который я использую:

for dir in $(find . -type d -name "single_copy_busco_sequences"); do  
    sppname=$(dirname $(dirname $(dirname $dir))| sed 's@./@@g');
    for file in ${dir}/*.faa; do name=$(basename $file); cp $file /Users/admin/Documents/busco_aa/${sppname}_${name}; sed -i '' 's@>@>'${sppname}'|@g' /Users/admin/Documents/busco_aa/${sppname}_${name}; cut -f 1 -d ":" /Users/admin/Documents/busco_aa/${sppname}_${name} > /Users/admin/Documents/busco_aa/${sppname}_${name}.1;
    done;
done

Переменная sppname - это что-то вроде Gender_species. Вы знаете, как я могу добавить строку в моем скрипте, чтобы создать новую переменную с именем abbrev, которая преобразует Gender_species в Genspethe 3 first letters кошка с 3 first буквами после _

Примеры:

Homo_sapiens gives Homsap
Canis_lupus gives Canlup

и т. Д.

Спасибо за помощь:)

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Все это можно сделать с помощью встроенного в bash расширения параметров .В частности, строковые индексы и удаление подстрок .

$ a=Homo_sapiens; prefix=${a:0:3}; a=${a#*_}; postfix=${a:0:3}; echo $prefix$postfix
Homsap

$ a=Canis_lupus; prefix=${a:0:3}; a=${a#*_}; postfix=${a:0:3}; echo $prefix$postfix
Canlup

Использование встроенных команд bash всегда более эффективно, чем создание отдельных подоболочек (-ей) для вызова утилит для выполнениято же самое.

Пояснение

Ваша строковый индекс форма (только bash) позволяет индексировать символы из строки, например

* ${parameter:offset:length}  ## indexes are zero based, ${a:0:2} is 1st 2 chars

Где parameter - это просто имя переменной, содержащей строку.

(вы можете индексировать с конца строки, используя отрицательное смещение, которому предшествует space или заключенное вкруглые скобки, например, a=12345; echo ${a: -3:2} выходные данные "34")

    prefix=${a:0:3}   ## save the first 3 characters in prefix
    a=${a#*_}         ## remove the front of the string through '_' (see below)
    postfix=${a:0:3}  ## save the first 3 characters after '_'

Ваше удаление подстроки форм (POSIX):

  • ${parameter#word} обрезать до 1-говхождение слова из параметра слева
  • ${parameter##word} обрезка до последнего вхождения слова из параметра слева

и

  • ${parameter%word} обрезка до1-е вхождение слова из параметра справа
  • ${parameter%%word} обрезка до последнего вхождения словаиз параметра справа

( слово также может содержать глобирование для расширения до шаблона)

   a=${a#*_}   ## trim from left up to (and including) the first '_'

См. bash (1) -Страница руководства Linux для полной информации.

0 голосов
/ 31 января 2019

Этого можно добиться с помощью регулярного выражения с помощью sed:

echo "Homo_sapiens" | sed -e s'/^\(...\).*_\(...\).*/\1\2/'
Homsap

start, получить 3 символа (оставить в \ 1), что угодно, _, что угодно, получить 3 символа (сохранить в \2) что-нибудь

Замените echo "Homo_sapiens" на вашу $ dir вещь

PS: потерпит неудачу, если у вас будет менее 3 символов в одном слове

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...