Вы можете сделать это разными способами, как показано. Шаблоны сохраняются по одному на строку в файле списка.
Примечание. Мы отличаем файл шаблонов от остальных файлов данных (предположительно, ваших файлов * cha
) с помощью различных уловок в bash, perl и sed.
В случае "sed" шаблоны хранятся в точечном файле, также известном как скрытые файлы, &
с добавлением "." чтобы помочь коду "sed" отличить файл шаблона
от обычного файла данных. Это WA для sed, поскольку он не имеет, как в
awk, концепции "FNR".
grep -E -f ./.your_patterns_listfile ./* |
sed -e 's/://' -e 's/v|//'
find . -maxdepth 1 -type f -name '*' -exec \
perl -wMstrict -Mvars='*pat' -lne '
BEGIN { ($pat) = @ARGV; }
if ( $pat ne $ARGV ) {
@pat = map { quotemeta } keys %pat unless @pat;
next unless /^From file [<]/ .. /^--*/;
my $cha;
/^From file [<]([>]*)[>]/ and $cha = $1;
for my $pat ( @pat ) {
/^\s+ (\d+) \s+ v[|] ($pat) $/x and print(join("\t",$ARGV,$1,$2)),last
}
} else {
$pat{$_}++;
}
' ./your_patterns_listfile {} +
echo '.' >> ./.your_patterns_listfile
find . -maxdepth 1 -type f -name '*' -exec \
sed -e '
1{
:pats
N
/\n\.$/!bpats
s///;h;d
}
/^From file </!d
$d;N
/\n[ ]*\([1-9][0-9]*\)[ ]v|/{
s//\n\1\t|/;s/$/|/
G;s/\n/&&/;s/$/\n/
/\n\n[1-9][0-9]*\t|\([^|]*\)|.*\n\1\n/{
s/^From file <\([^>]*\)>\n\n\([1-9][0-9]*\)\t|\([^|]*\)|/\1\t\2\t\3\n&/
P;s/\n\n.*//;D
}
}
s/\n.*//;s/^/\n/;D
' ./.your_patterns_listfile {} +
find . -type f -name '*' ! -name 'your_patterns_listfile' -exec \
sh -c '
shift $1
flag=
eval "`echo '\''readonly NL=qsq'\'' | tr '\''qs'\'' '\''\047\012'\''`"; # newline
pats=$(< $1); shift
cat "$@" |
while IFS= read -r line
do
case $line in
"From file <"* )
cha=${line#*"<"}
cha=${cha%">"}
unset flag
continue
;;
*[0-9]*v\|* )
pat=${line#*"|"}
num=${line%%"v"*}
num=${num//[ ]/}
case $pats in
"$pat" | *"$NL$pat$NL"* | "$pat$NL"* | *"$NL$pat" )
${flag+":"} printf "%s\t" "$cha" "$num" "$pat"
${flag+":"} echo
;;
esac
;;
'' | *[!-]* )
:
;;
* )
flag=
;;
esac
done
' 2 1 ./your_patterns_listfile {} +