2011-08-24 12 views
15

ho il seguente comando awk all'interno di un ciclo "for" in bash:Aggiungere zeri che porta a awk variabile

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

Questa legge una serie di file con il nome $ pdb.pdb e li divide in file chiamato $ pdb_1.pdb, $ pdb_2.pdb, ..., $ pdb_21.pdb, ecc. Tuttavia, mi piacerebbe produrre file con nomi come $ pdb_01.pdb, $ pdb_02.pdb, ..., $ pdb_21.pdb , cioè, aggiungere zeri padding alla variabile "file".

Ho provato senza successo utilizzando printf in modi diversi. L'aiuto sarebbe molto apprezzato.

+0

Sapete quanto in alto saranno i numeri? Il numero massimo di 2 cifre? –

risposta

21

Sostituire file in uscita con sprintf("%02d", file).

O anche l'intero assetto con filename = sprintf("%s_%02d.pdb", pdb, file);.

+0

Fin qui ho provato la prima opzione e funziona come un incantesimo. Grazie mille. – mirix

20

Ecco come creare gli zeri iniziali con awk:

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

Sostituire %02 con il numero totale di cifre è necessario (compresi gli zeri).

+0

Si noti che questo funziona solo se si stampa direttamente i numeri formattati nell'output. Se stai cercando di usare il numero formattato in una variabile o funzione awk, probabilmente dovrai usare 'sprintf', come menzionato nell'altra risposta. –

0

Ecco una funzione che a sinistra o valori destro rilievi con zeri a seconda dei parametri: zeropad (valore, conteggio, direzione)

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

Alcuni test:

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

L' test:

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

Non è completamente testato sul campo di battaglia, quindi st i parametri dell'intervallo possono dare risultati strani.