2012-12-30 11 views
15

awk sarebbe utile per convertire "Ingresso" in "Uscita desiderata"?Usare awk per allineare le colonne nel file di testo?

ingresso

testing speed of encryption 
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes) 
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes) 
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes) 
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes) 
test 4 (128 bit key, 8192 byte blocks): 8614 operations in 1 seconds (70565888 bytes) 
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes) 

output desiderato

testing speed of encryption 
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes) 
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes) 
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes) 
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes) 
test 4 (128 bit key, 8192 byte blocks): 8614 operations in 1 seconds (70565888 bytes) 
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes) 

risposta

37

Un trucco per allineare destra usando column è quello di utilizzare rev:

$ head -1 file; tail -n+2 file | rev | column -t | rev 
testing speed of encryption 
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes) 
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes) 
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes) 
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes) 
test 4 (128 bit key, 8192 byte blocks):  8614 operations in 1 seconds (70565888 bytes) 
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes) 
+2

+1, molto bello ... – Guru

+5

bello. Tuttavia, questo non funziona se l'ultima colonna ha larghezza non costante. – hardmooth

14

Sì. Guarda la sintassi per la funzione printf() di awk. Codice di esempio abbreviato. . .

{ 
    printf("%s %2s ", $1, $2); 
    printf("%4s %s %s ", $3, $4, $5); 
    printf("%4s %s %s ", $6, $7, $8); 
    printf("%7s\n", $9); 
} 

Uscita.

test 0 (64 bit key, 16 byte blocks): 2250265 
test 1 (128 bit key, 64 byte blocks): 879149 
test 2 (128 bit key, 256 byte blocks): 258978 
test 3 (128 bit key, 1024 byte blocks): 68218 
test 4 (128 bit key, 8192 byte blocks): 8614 
test 10 (256 bit key, 16 byte blocks): 1790881 

Docs for GNU awk's printf().

Esistono diversi modi per passare la "direzione" attraverso non modificati. In questo modo si presuppone che sia sempre sulla prima riga del file.

NR==1 { print $0} 
NR>1 { 
    printf("%s %2s ", $1, $2); 
    printf("%4s %s %s ", $3, $4, $5); 
    printf("%4s %s %s ", $6, $7, $8); 
    printf("%7s\n", $9); 
} 
+0

Molto interessante! È possibile passare l'intestazione senza essere allineati? –

+0

@SandraSchlichting: Sì, vedere la risposta aggiornata. –

+0

Per quanto posso dire, questo non funziona in modo affidabile con le stringhe con caratteri multibyte come il modificatore 'width' (' 4' in '% 4s') sta contando i byte invece di quello che la maggior parte delle persone considererebbe" caratteri " –

4
awk ' 
FNR==1 { if (NR==FNR) print; next } 
NR==FNR { 
    for(i=1;i<=NF;i++) 
     w[i] = (w[i] <= length($i) ? length($i) : w[i]) 
    next 
} 
{ 
    for(i=1;i<=NF;i++) 
     printf "%*s",w[i]+(i>1?1:0),$i 
    print "" 
} 
' file file 
Problemi correlati