Как сопоставить конкретное слово или его части в операторе case?

Существует утилита под названием fastagrep, которая делает то, что вам нужно. Ваши данные находятся в файлах data1 и data2:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE1:"
head -20 $FILE1

pl " Input data file $FILE2:"
head -20 $FILE2

pl " Expected output:"
cat $E

pl " Results:"
fastagrep -f $FILE1 $FILE2

производство:

-----
 Input data file data1:
>sp|B7UM99|TIR_ECO27
>sp|P06616|ERA_ECOLI

-----
 Input data file data2:
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
......
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
............
>sp|P0AD68|HUMAN
MKAAAKTQKPKRQEEHANFISWRFALLCGC
ILLALAFLLGRVAWLQVISPDMLVKEGDMR
SLRVQQVSTSRGMITDRSGRPLAVSVPVKA
IWADPKEVHDAGGISVGDRWKALANALNIP

-----
 Expected output:
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
......
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI

-----
 Results:
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
......
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
............

Это было в такой системе, как:

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
perl 5.20.2

Детали для фастагрепа:

fastagrep       extract sequences from a multi-FASTA file by regex. (what)
Path    : ~/bin/fastagrep
Version : fastagrep version 0.3
Length  : 392 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/env perl
Home    : https://github.com/rec3141/rec-genome-tools (doc)
Modules : (for perl codes)
 strict 1.08
 warnings       1.23
 Getopt::Std    1.10
 IO::File       1.16
 Data::Dumper   2.151_01

С наилучшими пожеланиями... ура, дрл

4
01.04.2021, 12:42
1 ответ

Вы упомянули «опцию» в комментарии , что навело меня на мысль, что, возможно, вы пытаетесь проанализировать параметры командной строки. Поскольку утилита POSIX getoptsне может анализировать «длинные параметры», такие как --testили --example, мы можем вместо этого попросить GNU getoptпроанализировать их для нас.

Ниже приведен сценарий оболочки, который принимает короткие параметры -eи -tи соответствующие «длинные параметры» --exampleи --test. Длинные параметры могут быть указаны в командной строке как любая строка префикса полной строки параметров, например. --e, --exи т. д. все разрешится в --example. В приведенном ниже коде опция --test/ -tпринимает обязательный аргумент, обозначенный конечным :после соответствующей длинной и короткой строки опции.

GNUgetopt(частьutil-linux)используется для разбора командной строки.

#!/bin/sh

opts=$( getopt -o et: -l example,test: -- "$@" )
if [ "$?" -ne 0 ]; then
    echo 'Error in getopt' >&2
    exit 1
fi

eval set -- "$opts"
unset opts

unset testarg
while true; do
    case "$1" in
        -e|--example)
            echo 'Example option'
            shift
            ;;
        -t|--test)
            echo 'Test option'
            testarg=$2
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            echo 'Command line parsing error' >&2
            exit 1
    esac
done

if [ -n "$testarg" ]; then
        printf 'Test argument = "%s"\n' "$testarg"
fi

Тестирование:

$./script -e
Example option
$./script --exa
Example option
$./script --exa -t hello
Example option
Test option
Test argument = "hello"
$./script --exa --te='hello world'
Example option
Test option
Test argument = "hello world"
$./script -et 'hello world'
Example option
Test option
Test argument = "hello world"
$./script -eethello
Example option
Example option
Test option
Test argument = "hello"
2
28.04.2021, 22:54

Теги

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