2012-12-30 1 views
15

Würde awk nützlich sein, um "Eingang" in "Gewünschter Ausgang" zu konvertieren?Mit awk Spalten in Textdateien ausrichten?

Eingang

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) 

Wunsch Ausgang

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) 

Antwort

37

Ein Trick rechts mit column auszurichten ist rev zu verwenden:

$ 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, sehr nett ... – Guru

+5

nett. Dies funktioniert jedoch nicht, wenn die letzte Spalte eine nicht konstante Breite hat. – hardmooth

14

Ja. Sehen Sie sich die Syntax für die Funktion printf() von awk an. Abgekürzter Beispielcode . .

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

Ausgabe.

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

Es gibt mehrere Möglichkeiten, die "Überschrift" unverändert zu übergeben. Auf diese Weise wird davon ausgegangen, dass es sich immer in der ersten Zeile der Datei befindet.

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

Sehr interessant! Ist es möglich, den Header ohne Ausrichtung passieren zu lassen? –

+0

@SandraSchlichting: Ja, siehe aktualisierte Antwort. –

+0

Soweit ich das beurteilen kann, funktioniert dies nicht zuverlässig mit Strings mit Multibyte-Zeichen, da der 'width'-Modifikator ('4' in'% 4s') Bytes zählt anstelle dessen, was die meisten Menschen als "Zeichen" ansehen würden –

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