2011-08-24 9 views
15

Tôi có lệnh awk sau đây trong một "cho" vòng lặp trong bash:Thêm zero dẫn đến awk biến

awk -v pdb="$pdb" 'BEGIN {file = 1; filename = pdb"_" file ".pdb"} 
/ENDMDL/ {getline; file ++; filename = pdb"_" file ".pdb"} 
{print $0 > filename}' < ${pdb}.pdb 

này đọc một loạt các tập tin với tên $ pdb.pdb và tách chúng trong các tập tin gọi $ pdb_1.pdb, $ pdb_2.pdb, ..., $ pdb_21.pdb, v.v. Tuy nhiên, tôi muốn tạo các tệp có tên như $ pdb_01.pdb, $ pdb_02.pdb, ..., $ pdb_21.pdb , nghĩa là, để thêm số không đệm vào biến "tệp".

Tôi đã thử mà không thành công khi sử dụng printf theo các cách khác nhau. Trợ giúp sẽ được nhiều đánh giá cao.

+0

bạn có biết số lượng sẽ tăng lên bao nhiêu không? Có tối đa 2 chữ số không? –

Trả lời

21

Thay thế file trên đầu ra bằng sprintf("%02d", file).

Hoặc thậm chí là toàn bộ sự đảm bảo với filename = sprintf("%s_%02d.pdb", pdb, file);.

+0

Điều này đến nay tôi đã thử các tùy chọn đầu tiên và nó hoạt động như một say mê. Cảm ơn rất nhiều. – mirix

20

Dưới đây là làm thế nào để tạo ra số không hàng đầu với awk:

# echo 1 | awk '{ printf("%02d\n", $1) }' 
01 
# echo 21 | awk '{ printf("%02d\n", $1) }' 
21 

Thay %02 với tổng số chữ số bạn cần (bao gồm số không).

+0

Lưu ý rằng thao tác này chỉ hoạt động nếu bạn đang trực tiếp in các số đã định dạng sang đầu ra. Nếu bạn đang tìm cách sử dụng số được định dạng trong một biến hoặc hàm awk, bạn có thể sẽ cần phải sử dụng 'sprintf', như được đề cập trong câu trả lời khác. –

0

Đây là một chức năng mà trái hoặc giá trị phải miếng đệm với zero tùy thuộc vào các thông số: zeropad (giá trị, đếm, hướng)

function zeropad(s,c,d) { 
    if(d!="r")    
     d="l"    # l is the default and fallback value 
    return sprintf("%" (d=="l"? "0" c:"") "d" (d=="r"?"%0" c-length(s) "d":""), s,"") 
} 
{       # test main 
    print zeropad($1,$2,$3) 
} 

Một số xét nghiệm:

$ cat test 
2 3 l 
2 4 r 
2 5 
a 6 r 

Các kiểm tra:

$ awk -f program.awk test 
002 
2000 
00002 
000000 

Nó không được thử nghiệm chiến trường đầy đủ các thông số phạm vi có thể mang lại kết quả lạ.