Bashの「for」ループ内に次のawkコマンドがあります。
awk -v pdb="$pdb" 'BEGIN {file = 1; filename = pdb"_" file ".pdb"}
/ENDMDL/ {getline; file ++; filename = pdb"_" file ".pdb"}
{print $0 > filename}' < ${pdb}.pdb
これにより、$ pdb.pdbという名前の一連のファイルが読み取られ、$ pdb_1.pdb、$ pdb_2.pdb、...、$ pdb_21.pdbなどの名前のファイルに分割されます。ただし、名前が$ pdb_01.pdb、$ pdb_02.pdb、...、$ pdb_21.pdbのように、つまり「ファイル」変数にパディングゼロを追加します。
私はさまざまな方法でprintfを使用して成功せずに試しました。助けをいただければ幸いです。
出力のfile
をsprintf("%02d", file)
に置き換えます。
または、filename = sprintf("%s_%02d.pdb", pdb, file);
を使用した割り当て全体です。
awk
で先行ゼロを作成する方法は次のとおりです。
# echo 1 | awk '{ printf("%02d\n", $1) }'
01
# echo 21 | awk '{ printf("%02d\n", $1) }'
21
置換%02
には、必要な桁数(ゼロを含む)を指定します。
これは、高価なprintf
を使わずに行います。最初のパラメータはパディングする文字列、2番目はパディング後の全長です。
echo 722 8 | awk '{ for(c = 0; c < $2; c++) s = s"0"; s = s$1; print substr(s, 1 + length(s) - $2); }'
結果の文字列の長さが事前にわかっている場合は、簡略化したバージョンを使用できます(たとえば、8が制限です)。
echo 722 | awk '{ s = "00000000"$1; print substr(s, 1 + length(s) - 8); }'
どちらの場合も結果は00000722
。
以下は、パラメーターに応じて値をゼロで左または右に埋め込む関数です。zeropad(value、count、direction)
function zeropad(s,c,d) {
if(d!="r")
d="l" # l is the default and fallback value
return sprintf("%" (d=="l"? "0" c:"") "d" (d=="r"?"%0" c-length(s) "d":""), s,"")
}
{ # test main
print zeropad($1,$2,$3)
}
いくつかのテスト:
$ cat test
2 3 l
2 4 r
2 5
a 6 r
テスト:
$ awk -f program.awk test
002
2000
00002
000000
完全に戦場でテストされていないため、奇妙なパラメーターが奇妙な結果をもたらす可能性があります。