2009-06-15 25 views
21

Cách tốt nhất để dán số khi in đầu ra bằng bash, sao cho các con số được căn chỉnh thẳng xuống màn hình. Vì vậy, đây:số căn phải/số pad trong bash

00364.txt with 28 words in 0m0.927s 
00366.txt with 105 words in 0m2.422s 
00367.txt with 168 words in 0m3.292s 
00368.txt with 1515 words in 0m27.238 

nên được in như thế này:

00364.txt with 28 words in 0m0.927s 
00366.txt with 105 words in 0m2.422s 
00367.txt with 168 words in 0m3.292s 
00368.txt with 1515 words in 0m27.238 

Tôi đang in những hiểu từng dòng từ bên trong một vòng lặp for. Và tôi sẽ biết giới hạn trên về số lượng từ trong một tập tin (không phải ngay bây giờ).

Trả lời

34

Để bash, hãy sử dụng lệnh printf có cờ liên kết.

Ví dụ:

printf '%7s' 'hello' 

Prints:

hello 

(Hãy tưởng tượng 2 không gian đó)

Bây giờ, sử dụng theo ý của bạn cho vấn đề của bạn.

+0

Wow, ok đó là khá dễ dàng. Tôi chỉ nên có RTFM. Tôi đoán tôi chỉ giả định không chính xác nó sẽ khó hơn trong bash. Cảm ơn! – nedned

+0

Để xóa "7" được mã hóa cứng và ** tính toán phần đệm tự động **, hãy xem câu trả lời của tôi bên dưới. –

22

Dưới đây là ví dụ rõ ràng hơn một chút:

#!/bin/bash 
for i in 21 137 1517 
do 
    printf "...%5d ...\n" "$i" 
done 

Tạo:

... 21 ... 
... 137 ... 
... 1517 ... 
+0

Ngoài ra, hãy xem [this] (http://stackoverflow.com/a/4410103/26428) và [this] (http://stackoverflow.com/a/2951428/26428). –

+0

Dennis: cảm ơn bạn đã dành thời gian để tạo một ví dụ rõ ràng, mà không nhận được điểm trả lời chính xác. – MaasSql

+0

Để xóa "5" được mã hóa cứng và tự động tính toán phần đệm, hãy xem câu trả lời của tôi bên dưới. –

9

Nếu bạn quan tâm trong việc thay đổi chiều rộng động, bạn có thể sử dụng printf của '% * s' tính năng

printf '%*s' 20 hello 

in

   hello 
+2

"động", tốt, đây là vỏ nên tôi không thấy nó khác với 'printf '% $ {count} d" hello' –

+0

Đây là câu trả lời hay nhất ở đây, vì'% * s 'tính đến chiều dài của chuỗi. Nếu bạn làm 'printf '% * s' $ (tput cols) hello', hello sẽ được in ở cạnh xa của cửa sổ đầu cuối. – Jonah

1

Kết hợp các câu trả lời ở trên sẽ xóa độ dài chuỗi "5" được mã hóa cứng.

VALUES=(21 137 1517 2121567251672561) 
MAX=1 

# Calculate the length of the longest item in VALUES 
for i in "${VALUES[@]}"; do 
    [ ${#i} -gt ${MAX} ] && MAX=${#i} 
done 

for i in "${VALUES[@]}"; do 
    printf "... %*s ...\n" $MAX "$i" 
done 

Kết quả:

...    21 ... 
...    137 ... 
...    1517 ... 
... 2121567251672561 ... 
Các vấn đề liên quan