2012-12-30 29 views
15

Liệu awk có hữu ích để chuyển đổi "Đầu vào" thành "Đầu ra mong muốn" không?Sử dụng awk để căn chỉnh các cột trong tệp văn bản?

Input

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) 

đầu ra mong muốn

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) 

Trả lời

37

Một thủ thuật để gắn kết đúng bằng column là sử dụng 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, rất đẹp ... – Guru

+5

đẹp. Tuy nhiên, điều này không hoạt động nếu cột cuối cùng có chiều rộng không đổi. – hardmooth

14

Yes. Xem cú pháp của hàm printf() của awk. Mã mẫu viết tắt. . .

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

Đầu ra.

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

Có một số cách để chuyển "tiêu đề" thông qua chưa sửa đổi. Bằng cách này, giả sử nó luôn nằm trên dòng đầu tiên của tệp.

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

Rất thú vị! Có thể có tiêu đề đi qua mà không được căn chỉnh không? –

+0

@SandraSchlichting: Có, xem câu trả lời cập nhật. –

+0

Theo như tôi có thể nói, điều này không hoạt động đáng tin cậy với các chuỗi với các ký tự nhiều byte khi sửa đổi 'chiều rộng' (' 4' trong '% 4s') đang đếm byte thay vì hầu hết mọi người sẽ xem" ký tự " –

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 
Các vấn đề liên quan