Существует утилита под названием 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
С наилучшими пожеланиями... ура, дрл
Вы упомянули «опцию» в комментарии , что навело меня на мысль, что, возможно, вы пытаетесь проанализировать параметры командной строки. Поскольку утилита 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"