AWK - In ấn đẹp

Cho đến nay, chúng tôi đã sử dụng AWK's printprintfchức năng hiển thị dữ liệu trên đầu ra tiêu chuẩn. Nhưng printf mạnh hơn nhiều so với những gì chúng ta đã thấy trước đây. Hàm này được mượn từ ngôn ngữ C và rất hữu ích khi tạo ra đầu ra có định dạng. Dưới đây là cú pháp của câu lệnh printf:

Cú pháp

printf fmt, expr-list

Trong cú pháp trên fmt là một chuỗi các đặc tả và hằng số định dạng. expr-list là danh sách các đối số tương ứng với các mã định dạng.

Trình tự thoát

Tương tự như bất kỳ chuỗi nào, định dạng có thể chứa các chuỗi thoát được nhúng. Thảo luận bên dưới là các trình tự thoát được AWK hỗ trợ -

Dòng mới

Bản in ví dụ sau HelloWorld trong các dòng riêng biệt sử dụng ký tự dòng mới -

Example

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Hello
World

Tab ngang

Ví dụ sau sử dụng tab ngang để hiển thị trường khác:

Example

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

Output

Sr No   Name    Sub Marks

Tab dọc

Ví dụ sau sử dụng tab dọc sau mỗi lần được nộp -

Example

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Sr No
   Name
      Sub
         Marks

Backspace

Ví dụ sau sẽ in một khoảng lùi sau mỗi trường ngoại trừ trường cuối cùng. Nó xóa số cuối cùng khỏi ba trường đầu tiên. Ví dụ,Field 1 được hiển thị dưới dạng Field, bởi vì ký tự cuối cùng bị xóa bằng phím xóa lùi. Tuy nhiên, trường cuối cùngField 4 được hiển thị như nó vốn có, vì chúng tôi không có \b sau Field 4.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Field Field Field Field 4

Vận chuyển trở lại

Trong ví dụ sau, sau khi in mọi trường, chúng tôi thực hiện Carriage Return và in giá trị tiếp theo lên trên giá trị in hiện tại. Nó có nghĩa là, trong đầu ra cuối cùng, bạn chỉ có thể thấyField 4, vì nó là thứ cuối cùng được in trên tất cả các trường trước đó.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Field 4

Thức ăn dạng

Ví dụ sau sử dụng nguồn cấp biểu mẫu sau khi in mỗi trường.

Example

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Sr No
   Name
      Sub
         Marks

Định dạng chỉ định

Như trong ngôn ngữ C, AWK cũng có các công cụ định dạng. Phiên bản AWK của câu lệnh printf chấp nhận các định dạng đặc tả chuyển đổi sau:

% c

Nó in một ký tự duy nhất. Nếu đối số được sử dụng cho%clà số, nó được coi như một ký tự và được in ra. Nếu không, đối số được giả định là một chuỗi và ký tự đầu tiên duy nhất của chuỗi đó được in.

Example

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

Output

Khi thực thi mã này, bạn nhận được kết quả sau:

ASCII value 65 = character A

% d và% i

Nó chỉ in phần nguyên của một số thập phân.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 80

% e và% E

Nó in ra một số dấu phẩy động có dạng [-] d.dddddde [+ -] dd.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 8.066000e+01

Các %E định dạng sử dụng E thay cho e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 8.066000E+01

% f

Nó in ra một số dấu phẩy động có dạng [-] ddd.dddddd.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 80.660000

% g và% G

Sử dụng chuyển đổi% e hoặc% f, tùy theo chuyển đổi nào ngắn hơn, với các số 0 không đáng kể bị loại bỏ.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

Output

Khi thực thi mã này, bạn nhận được kết quả sau:

Percentags = 80.66

Các %G định dạng sử dụng %E thay vì% e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 80.66

% o

Nó in ra một số bát phân không dấu.

Example

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Octal representation of decimal number 10 = 12

% u

Nó in một số thập phân không dấu.

Example

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Unsigned 10 = 10

%S

Nó in ra một chuỗi ký tự.

Example

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Name = Sherlock Holmes

% x và% X

Nó in một số thập lục phân không dấu. Các%X định dạng sử dụng chữ hoa thay vì chữ thường.

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Hexadecimal representation of decimal number 15 = f

Bây giờ hãy sử dụng% X và quan sát kết quả -

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Hexadecimal representation of decimal number 15 = F

%%

Nó in một đĩa đơn % ký tự và không có đối số nào được chuyển đổi.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Percentags = 80%

Tham số tùy chọn với%

Với % chúng ta có thể sử dụng các tham số tùy chọn sau:

Chiều rộng

Trường được đệm vào width. Theo mặc định, trường được đệm bằng dấu cách nhưng khi cờ 0 được sử dụng, trường được đệm bằng số 0.

Example

[jerry]$ awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Num1 =         10
Num2 =         20

Số không hàng đầu

Một số 0 đứng đầu hoạt động như một cờ, cho biết rằng đầu ra nên được đệm bằng các số 0 thay vì dấu cách. Xin lưu ý rằng cờ này chỉ có hiệu lực khi trường rộng hơn giá trị được in. Ví dụ sau đây mô tả điều này -

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Num1 = -0010
Num2 = 00020

Biện minh bên trái

Biểu thức phải được căn trái trong trường của nó. Khi chuỗi đầu vào ít hơn số ký tự được chỉ định và bạn muốn nó được căn trái, tức là bằng cách thêm dấu cách vào bên phải, hãy sử dụng ký hiệu dấu trừ (-) ngay sau% và trước số.

Trong ví dụ sau, đầu ra của lệnh AWK được nối với lệnh cat để hiển thị ký tự END OF LINE ($).

Example

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Num = 10   $

Dấu hiệu tiền tố

Nó luôn đặt trước các giá trị số bằng một dấu, ngay cả khi giá trị là số dương.

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Num1 = -10
Num2 = +20

Băm

Đối với% o, nó cung cấp số 0 ở đầu. Đối với% x và% X, nó cung cấp giá trị 0x hoặc 0X ở đầu tương ứng, chỉ khi kết quả là khác 0. Đối với% e,% E,% f và% F, kết quả luôn chứa dấu thập phân. Đối với% g và% G, các số không ở cuối không bị xóa khỏi kết quả. Ví dụ sau đây mô tả điều này -

Example

[jerry]$ awk 'BEGIN { 
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

Khi thực thi mã này, bạn nhận được kết quả sau:

Output

Octal representation = 012
Hexadecimal representation = 0XA