2012-12-30 9 views
15

Czy awk będzie przydatna do przekonwertowania "Wejście" na "Żądane wyjście"?Używanie awk do wyrównania kolumn w pliku tekstowym?

Wejście

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) 

Pożądany wyjście

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) 

Odpowiedz

37

Sztuczka wyrównać prawo używając column jest użycie 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, bardzo ładne ... – Guru

+5

ładne. Nie działa to jednak, jeśli ostatnia kolumna ma niestałą szerokość. – hardmooth

14

Tak. Sprawdź składnię funkcji printf() w awk. Skrócony kod przykładowy. . .

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

Wyjście.

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().

Istnieje kilka sposobów przekazania "nagłówka" przez niezmodyfikowaną. W ten sposób zakłada się, że zawsze znajduje się w pierwszym wierszu pliku.

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

Bardzo ciekawe! Czy możliwe jest przejście nagłówka bez wyrównania? –

+0

@SandraSchlichting: Tak, zobacz zaktualizowaną odpowiedź. –

+0

O ile wiem, nie działa to niezawodnie z ciągami znaków wielobajtowych, ponieważ modyfikator 'width' (' 4' w '% 4s') zlicza bajty zamiast tego, co większość ludzi uznałaby za" znaki ". –

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 
Powiązane problemy