![修改 bash 脚本中的各个文本字段](https://linux22.com/image/143274/%E4%BF%AE%E6%94%B9%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E5%90%84%E4%B8%AA%E6%96%87%E6%9C%AC%E5%AD%97%E6%AE%B5.png)
我有这个变量,其长度应始终为 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 模拟该代码块?然后创建另一个代码块,但这次替换第二个字母,然后重复第三个代码块的循环,替换第三个字母,依此类推。
答案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
逐步遍历给定肽序列中的位置,并且对于每个位置,有效的氨基酸代码在该位置被一一放入肽中(这使用肽部分的子串扩展直到相关位置,插入改变的氨基酸,然后对肽的尾端进行另一个子串扩展)。
答案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 ""
}
}
'
这符合您的需求吗?请注意,您只需要指定要排除的字符,而不是所有缺少“坏”字符的“好”字符。