你好我有以下代码
for i in *.dssp ; do
gawk 'BEGIN{ FIELDWIDTHS = "5 5 1 1 4 1 *"} $4 == "A" {s=s$6} END {print s}' | tr "[HGI]" "H" | tr "[BE]" "E" | tr "[TS ' ']" "C"
done
我能够通过使用一个特定的 .dssp 文件调用 shell 中的代码来成功执行,但是我有这些文件的目录,需要它循环遍历所有文件并保存输出,这是一堆字母( fasta 等)到一个新文件中,并带有从中提取的相应 id。我不知道从这里该去哪里
答案1
这里单独使用 awk:
gawk -v map='[GI]>H,B>E,[TS ]>C' '
BEGIN { nrf=split(map, tmp, /[,>]/); FIELDWIDTHS="5 5 1 1 4 1 *" }
$4=="A"{ buf= buf $6 }
ENDFILE{
for(i=1; i<=nrf; i+=2) gsub(tmp[i], tmp[i+1], buf);
print buf >FILENAME".output"; close(FILENAME".output"); buf=""
}' ./*.dssp
在这里,我们将字符映射转换作为变量参数-v map='[GI]>H,B>E,[TS ]>C'
传递给 awk(每个字符用逗号分隔;也用于提高每个映射组之间的可读性)。>
然后在 BEGIN{} 块内我们将来自的映射分开map
变量放入临时数组tmp
并将这些,
和>
视为分隔符;我们还通过 FIELDWIDTHS (GNU awk) 定义了字段。
接下来我们检查第四个字段是否等于“A”字符,如果是,则将每行的第六个字段以附加模式缓冲到buff
多变的。
在每个输入文件的末尾,我们处理 ENDFILE{} 块(GNU awk),这里我们循环遍历字符映射对,并将左侧字符替换为右侧字符buff
多变的;之后我们打印更新的buff
内容到与输入同名的输出文件,并添加后缀,如“fileName.output”。