2011-08-24 19 views
15

tengo el siguiente comando awk dentro de un bucle "for" en bash:Añadir ceros que lleva a awk variables

awk -v pdb="$pdb" 'BEGIN {file = 1; filename = pdb"_" file ".pdb"} 
/ENDMDL/ {getline; file ++; filename = pdb"_" file ".pdb"} 
{print $0 > filename}' < ${pdb}.pdb 

Esto lee una serie de archivos con el nombre $ pdb.pdb y los divide en archivos llamada $ pdb_1.pdb, $ pdb_2.pdb, ..., $ pdb_21.pdb, etc. Sin embargo, me gustaría producir archivos con nombres como $ pdb_01.pdb, $ pdb_02.pdb, ..., $ pdb_21.pdb , es decir, para agregar ceros de relleno a la variable "archivo".

He intentado sin éxito usar printf de diferentes maneras. La ayuda sería muy apreciada.

+0

¿sabes qué tan alto subirán los números? ¿Son 2 dígitos el máximo? –

Respuesta

21

Reemplace file en la salida con sprintf("%02d", file).

O incluso toda la asignación con filename = sprintf("%s_%02d.pdb", pdb, file);.

+0

Hasta aquí he probado la primera opción y funciona como un encanto. Un millón de gracias. – mirix

20

Aquí es cómo crear ceros a la izquierda con awk:

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

Reemplazar %02 con el número total de dígitos que necesita (incluyendo ceros).

+0

Tenga en cuenta que esto solo funciona si está imprimiendo directamente los números formateados en la salida. Si está buscando usar el número formateado en una variable o función awk, probablemente necesite usar 'sprintf', como se menciona en la otra respuesta. –

0

Aquí es una función que a la izquierda o valores-Pads derecha con ceros en función de los parámetros: zeropad (valor, cuentan, dirección)

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) 
} 

Algunas pruebas:

$ cat test 
2 3 l 
2 4 r 
2 5 
a 6 r 

El prueba:

$ awk -f program.awk test 
002 
2000 
00002 
000000 

No es totalmente probado en el campo de batalla por lo st los parámetros de rango pueden arrojar resultados extraños.