2つの文字列のインデックス比較

2つの文字列のインデックス比較

次のように同じ長さの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"

おすすめ記事