2011-08-24 92 views
15

我有內「爲」在bash循環以下awk命令:添加前導零的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以不同方式成功。幫助將不勝感激。

+0

你知道這個數字有多高嗎?最多2位數字? –

回答

21

sprintf("%02d", file)代替file輸出。

甚至整個分配filename = sprintf("%s_%02d.pdb", pdb, file);

+0

到目前爲止,我已經嘗試了第一個選項,它的作用就像一個魅力。太感謝了。 – mirix

20

以下是如何與awk創建前導零:

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

替換%02與數字的總數你需要(包括零)。

+0

請注意,這僅適用於將格式化數字直接打印到輸出的情況。如果您想在awk變量或函數中使用格式化數字,您可能需要使用'sprintf',如其他答案中所述。 –

0

這裏是向左或具有取決於參數零右墊值的函數:ZEROPAD(值,計數,方向)

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 

它沒有完全的戰場測試,所以st範圍參數可能產生奇怪的結果。