Bashスクリプトで個々のテキストフィールドを変更する

Bashスクリプトで個々のテキストフィールドを変更する

長さが常に9文字でなければならない変数があります。

PEPTIDE_SEQ="AAAAAAAAA"

その後、長さ変数を作成しました。

len=9 

私が望むのは、PEPTIDE_SEQで始まり、次のファイルチャンクとして出力することです。

AAAAAAAAA
CAAAAAAAA
DAAAAAAAA
EAAAAAAAA
FAAAAAAAA
GAAAAAAAA
HAAAAAAAA
IAAAAAAAA
KAAAAAAAA
LAAAAAAAA
MAAAAAAAA
NAAAAAAAA
PAAAAAAAA
QAAAAAAAA
RAAAAAAAA
SAAAAAAAA
TAAAAAAAA
VAAAAAAAA
WAAAAAAAA
YAAAAAAAA

B、J、O、U、X、Z文字を除いて、このコードを使用すると、PEPTIDE変数のみを繰り返しファイルに出力できます。

while [ $i -le 20 ]
do
    printf '%*s\n' "$len" | tr ' ' "$PEPTIDE_SEQ"  >> demo.txt
    i=$(( i+1 ))     # increments $i
done 

sedまたはawkを使用してこのコードブロックをどのようにシミュレートできますか?その後、別のコードブロックを作成しますが、今回は2番目の文字を置き換え、3番目のコードブロックに対してループを繰り返し、3番目の文字を置き換えるように続けます。

答え1

そしてbash

#!/bin/bash

pep="AAAAAAAA"

pos=1
while [ "$pos" -le "${#pep}" ]; do
    for aa in A C D E F G H I K L M N P Q R S T V W X Y
    do
        printf '%s%s%s\n' "${pep:0:pos-1}" "$aa" "${pep:pos}"
    done
    pos=$(( pos + 1 ))
done

外側のループはwhile所与のペプチド配列の位置を通過し、各位置について有効なアミノ酸コードがその位置のペプチドに1つずつ入力される(これは、関連位置までペプチド部分の部分文字列拡張を使用する。その後、ペプチドの尾端に別の部分文字列拡張が行われる。

答え2

あなたの仕様は明確ではありません。どのくらい行くのでしょうか?

awk -vPS="$PEPTIDE_SEQ" -vLEN=$len -vXCLI="B,J,O,U,X,Z" '
BEGIN   {PS = substr (PS, 2)     
         for (n=split (XCLI, T, ","); n; n--) XCL[T[n]]
         for (i=65; i<=90; i++) {C = sprintf ("%c", i)
                                 if (!(C in XCL)) printf "%s%s ", C, PS
                                }
         printf RS
        }
'
AAAAAAAAA CAAAAAAAA DAAAAAAAA EAAAAAAAA FAAAAAAAA GAAAAAAAA HAAAAAAAA IAAAAAAAA KAAAAAAAA LAAAAAAAA MAAAAAAAA NAAAAAAAA PAAAAAAAA QAAAAAAAA RAAAAAAAA SAAAAAAAA TAAAAAAAA VAAAAAAAA WAAAAAAAA YAAAAAAAA 

わかりますか?

編集する:あなたの意見を読んで、仕様をもう一度読んで見つけました。

awk -vPS="$PEPTIDE_SEQ" -vXCL="B,J,O,U,X,Z" '
BEGIN   {for (i=65; i<=90; i++) if (!(index(XCL, S = sprintf ("%c", i)))) print C[++n] = S, n
         for (i=1; i<=length(PS); i++)  {for (j=1; j<=n; j++) print substr (PS, 1, i-1) C[j] substr (PS, i+1)
                                         print ""
                                        }
        }
'

これはあなたの要件に合っていますか? 「不良」文字が欠落しているすべての「良好」文字ではなく、除外する文字を指定するだけです。

関連情報