25

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を使用してみましたが成功しませんでした。助けていただければ幸いです。

4

4 に答える 4

37

次のコマンドで先行ゼロを作成する方法は次のawkとおりです。

# echo 1 | awk '{ printf("%02d\n", $1) }'
01
# echo 21 | awk '{ printf("%02d\n", $1) }'
21

%02必要な合計桁数(ゼロを含む)に置き換えます。

于 2011-08-24T20:53:28.363 に答える
36

file出力を。に置き換えますsprintf("%02d", file)

または、。を使用した全体の割り当てfilename = sprintf("%s_%02d.pdb", pdb, file);です。

于 2011-08-24T20:51:33.147 に答える
3

これは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

于 2019-03-20T18:38:11.223 に答える
1

これは、パラメーターに応じてゼロで値を左または右に埋める関数です: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

完全に戦場でテストされていないため、奇妙なパラメータが奇妙な結果をもたらす可能性があります。

于 2017-08-06T10:22:49.663 に答える