次のように同じ長さの2つの二重引用符文字列があります。
"$con"
- (スペースと*で構成):
* ****** *** ** * **
と"$prot"
-(文字と-で構成):
M-ASDFRMKAWRGMLMI----WSGRCYYYYHQFLIMASDFRMKAMKAWWSGRCYNSHPPAAQVFYWLGLLSDVAGSALEAQ
$prot
*の位置に対応する同じ位置の文字列を抽出する方法です$con
。
ベストアンサー1
文字列に改行文字が含まれていない場合は、POSIXツールのみを使用するソリューションがあります。すべての文字を別々の行に配置し、両方のファイルを一緒に圧縮してから*
。
con_file=$(mktemp)
echo "$con" | sed -e 's/./&\
/g' >"$con_file"
prot_lines=$(echo "$prot" | sed -e 's/./&\
/g')
prot_extract=$(echo "$prot_lines" |
paste -d "$con_file" - |
sed -n 's/^* //p' |
tr -d '\n')
おそらく、より簡単で間違いなく、より速い別のアプローチは、ループをawkで書くことです。
echo "$prot" | awk -v filter="$con" '{
for (i=1; i<=length; i++) {
if (substr(filter, i, 1) == "*") printf "%c", substr($0, i, 1);
}
}
END {printf "\n"}'
別のアプローチは、フィルタをインデックス付きリストに変換することです。変換は遅いですが、インデックスセットあたりのタンパク質リストが長い場合は、これが最速の方法であることを願っています。
indices=$(echo "$con" |
sed 's/\*\**/,&\n/g' |
awk -F , 'BEGIN {start = 1}
/\*/ {start += length($1);
printf "%d-", start;
start += length($2);
printf "%d,", start - 1}')
indices=${indices%,}
echo "$prot" | cut "$indices"