AWK
AWK là ngôn ngữ lập trình được nhằm mục đích xử lý các Tập tin chữ (text file) theo nguyên lý khớp mẫu (pattern matching); đồng thời còn là tên gọi một chương trình trong hệ điều hành UNIX. Trong UNIX các chương trình được viết tên chữ thường nên AWK còn được gọi là Awk hoặc awk. Lịch sửVào đầu những năm 1970, công cụ mạnh trong UNIX có nhiệm vụ xử lý các file văn bản là grep, dựa trên nguyên tắc khớp mẫu. Các tác giả muốn bổ sung tính năng thao tác với số để đưa Awk thành một công cụ hữu hiệu có thể gần với một ngôn ngữ lập trình thực thụ. Đặc biệt là khả năng phân tách cú pháp; về phương diện này thì Awk gần như đảm đương được vai trò của lex và yacc[1]. Tên gọi AWK bắt nguồn từ cách gọi đùa của các đồng nghiệp tại Bell Labs, ghép các chữ cái đầu của tên ba tác giả: Aho, Weinberger, và Kernighan. Cú phápDạng cú pháp cơ bản của Awk là: mẫu_1 { câu lệnh_1 };
mẫu_2 { câu lệnh_2 };
...
Theo đó máy tính sẽ dò từng dòng trong file chữ và so sánh với mẫu 1. Nếu khớp, câu lệnh 1 được thực hiện. Tiếp theo máy tính so sánh dòng chữ với mẫu 2. Nếu khớp, câu lệnh 2 được thực hiện; và cứ như vậy. Ví dụĐể minh họa ta lấy ví dụ một file hồ sơ sức khỏe có nội dung như sau (mỗi người có thông tin giới tính và chiều cao)
Với một file như vậy các cột được Awk xem như các trường và được đặt tên MẫuMột mẫu chính là biểu thức so sánh (biểu thức logic) giữa tên cột và giá trị. Chẳng hạn:
$1 == "Minh"
$2 == "nam"
Khi gặp một mẫu, máy tính hiểu rằng chỉ thực hiện câu lệnh với những dòng tương ứng với mẫu đó. Trong trường hợp thực hiện lệnh với mọi dòng trong file chữ thì mẫu được bỏ qua, chỉ cần viết: {câu lệnh}
Đối với mẫu, còn có thể dùng các toán tử logic như Câu lệnhCâu lệnh thường dùng trong Awk là lệnh in ra màn hình (
{print $1}
{print $3 / 100}
Trong trường hợp in đầy đủ cả dòng thì ta bỏ qua phần Câu lệnh của Awk còn bao gồm cả những cấu trúc điều khiển (lặp, rẽ nhánh) thường gặp trong các ngôn ngữ lập trình. Ở đây, để đơn giản ta không đề cập đến. Ngoài ra, nếu có nhiều câu lệnh trong một cặp Lệnh đầy đủ: mẫu đi kèm câu lệnh
$2 == "nam" { print $1, $3 }
{print $1, $2, $3 / 100}
$1 == "Minh"
Trường hợp đặc biệtThông thường với mỗi dòng Chẳng hạn cần một dòng tiêu đề ở trên cùng, tiếp theo là in ra các con số chiều cao của những người nữ giới (giấu tên); cuối cùng là tổng kết có bao nhiêu người là nữ và chiều cao trung bình là bao nhiêu: BEGIN { print "So lieu chieu cao cua nu gioi " }
$1 = "nu" { print $3; sonu = sonu + 1; caotb = caotb + $3 }
END {print "Tong so nu la: %d\n voi chieu cao trung binh %8.2f m.", sonu, caotb*100.0/sonu }
BiếnCác biến trong Awk có kiểu động, không cần khai báo và tự động lấy các giá trị mặc định (bằng 0 với kiểu số, bằng xâu rỗng đối với chuỗi ký tự). Trong ví dụ trên hai biến là Chạy chương trìnhTừ dấu nhắc lệnh có thể gọi trực tiếp Awk với đoạn mã cùng tên file chữ, theo mẫu: awk 'nội dung mã lệnh awk' tên_file_chữ
awk -f tên_file_mã_lệnh.awk tên_file_chữ
Chẳng hạn: awk '$2 == "nam" { print $1, $3 }' chieucao.txt
Hoặc nếu đã lưu file mã lệnh, chẳng hạn awk -f trung_binh.awk chieucao.txt
Đối với UNIX và Linux, có thể xâu chuỗi Awk với các lệnh khác theo kiểu ống dẫn lệnh. Các phiên bảnHai phiên bản chính của Awk là: Xem thêm
Tài liệu
Tham khảo |
Portal di Ensiklopedia Dunia