Làm thế nào để viết lệnh và kịch bản AWK

Các lệnh, cú pháp và các ví dụ

Lệnh awk là một phương thức mạnh mẽ để xử lý hoặc phân tích các tệp văn bản — cụ thể là các tệp dữ liệu được sắp xếp theo các dòng (các hàng) và các cột.

Lệnh awk đơn giản có thể được chạy từ dòng lệnh . Các nhiệm vụ phức tạp hơn nên được viết như các chương trình awk (được gọi là các kịch bản awk) vào một tệp.

Định dạng cơ bản của lệnh awk trông như sau:

awk 'pattern {action}' input-file> tệp đầu ra

Điều này có nghĩa là: lấy từng dòng của tệp đầu vào; nếu dòng chứa mẫu áp dụng hành động cho dòng và ghi dòng kết quả vào tệp đầu ra. Nếu mẫu bị bỏ qua, hành động được áp dụng cho tất cả các dòng. Ví dụ:

awk '{print $ 5}' table1.txt> output1.txt

Câu lệnh này lấy phần tử của cột thứ 5 của mỗi dòng và viết nó như là một dòng trong tệp đầu ra "output.txt". Biến '$ 4' đề cập đến cột thứ hai. Tương tự như vậy bạn có thể truy cập cột đầu tiên, thứ hai và thứ ba, với $ 1, $ 2, $ 3, v.v. Theo mặc định, cột được giả định được phân tách bằng dấu cách hoặc tab (được gọi là khoảng trắng). Vì vậy, nếu tệp đầu vào "table1.txt" chứa các dòng sau:

1, Justin Timberlake, Tiêu đề 545, Giá $ 7,30 2, Taylor Swift, Tiêu đề 723, Giá $ 7,90 3, Mick Jagger, Tiêu đề 610, Giá $ 7,90 4, Lady Gaga, Tiêu đề 118, Giá $ 7,50 5, Tiền mặt Johnny, Tiêu đề 482, Giá $ 6,50 6, Elvis Presley, Tiêu đề 335, Giá $ 7,30 7, John Lennon, Tiêu đề 271, Giá $ 7,90 8, Michael Jackson, Tiêu đề 373, Giá $ 5,50

Sau đó, lệnh sẽ viết các dòng sau vào tệp đầu ra "output1.txt":

545, 723, 610, 118, 482, 335, 271, 373,

Nếu dấu phân tách cột là một thứ khác với dấu cách hoặc tab, chẳng hạn như dấu phẩy, bạn có thể chỉ định dấu tách trong câu lệnh awk như sau:

awk -F, '{print $ 3}' table1.txt> output1.txt

Điều này sẽ chọn phần tử từ cột 3 của mỗi dòng nếu các cột được coi là được phân tách bằng dấu phẩy. Do đó, đầu ra, trong trường hợp này, sẽ là:

Tiêu đề 545 Tiêu đề 723 Tiêu đề 610 Tiêu đề 118 Tiêu đề 482 Tiêu đề 335 Tiêu đề 271 Tiêu đề 373

Danh sách các câu lệnh bên trong dấu ngoặc nhọn ('{', '}') được gọi là một khối. Nếu bạn đặt một biểu thức có điều kiện ở phía trước của một khối, câu lệnh bên trong khối sẽ được thực thi chỉ khi điều kiện là đúng.

awk '$ 7 == "\ $ 7.30" {print $ 3}' table1.txt

Trong trường hợp này, điều kiện là $ 7 == "\ $ 7,30", có nghĩa là phần tử ở cột 7 bằng $ 7,30. Dấu gạch chéo ngược ở phía trước ký hiệu đô la được sử dụng để ngăn hệ thống giải thích $ 7 dưới dạng biến và thay vào đó lấy ký hiệu đô la theo nghĩa đen.

Vì vậy, tuyên bố này awk in ra các yếu tố ở cột thứ 3 của mỗi dòng có một "$ 7,30" tại cột 7.

Bạn cũng có thể sử dụng cụm từ thông dụng làm điều kiện. Ví dụ:

awk '/ 30 / {print $ 3}' table1.txt

Chuỗi giữa hai dấu gạch chéo ('/') là cụm từ thông dụng. Trong trường hợp này, nó chỉ là chuỗi "30." Điều này có nghĩa là nếu một dòng chứa chuỗi "30", hệ thống sẽ in ra phần tử ở cột thứ 3 của dòng đó. Đầu ra trong ví dụ trên sẽ là:

Timberlake, Gaga, Presley,

Nếu các yếu tố bảng là số awk có thể chạy các tính toán trên chúng như trong ví dụ này:

awk '{print ($ 2 * $ 3) + $ 7}'

Bên cạnh các biến truy cập vào các phần tử của hàng hiện tại ($ 1, $ 2, v.v.) có biến $ 0 đề cập đến hàng đầy đủ (dòng) và biến NF chứa số lượng trường.

Bạn cũng có thể xác định các biến mới như trong ví dụ này:

awk '{sum = 0; cho (col = 1; col <= NF; col ++) tổng cộng + = $ col; tổng in; } '

Điều này tính toán và in tổng của tất cả các yếu tố của mỗi hàng.

Câu lệnh awk thường được kết hợp với lệnh sed .