こんにちは、次のコードがあります
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ファイルを使用してシェルからコードを呼び出すことで正常に実行できますが、これらのファイルのディレクトリがあり、すべてのファイルを繰り返し出力を保存するために必要です。これは複数の文字(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)を介してフィールドを定義します。
次に、4番目のフィールドが「A」文字と同じであることを確認し、そうであれば追加モードで各行の6番目のフィールドをバッファリングします。buff
変える
各入力ファイルの末尾でENDFILE {}ブロック(GNU awk)を処理します。ここでは、文字マップのペアを繰り返し、左の文字を右の文字に置き換えます。buff
変更可能後で更新された内容を印刷します。buff
入力と同じ名前の出力ファイルにコンテンツを追加し、「fileName.output」などのサフィックスを追加します。