Cách dùng AWK (GAWK) để xử lý tệp tin tài liệu (1)
March 9, 2019 by Kinh Nguyen
Cách chạy
- Trên Linux mở Terminal, xong
- Trên Mac cài với
brew install gawk
- Trên Windows, tải và cài, thiết lập
PATH
mở Command Prompt.
Cú pháp
Tìm nội dung
trong tệp tin
và chạy xử lý
awk 'nội dung { xử lý }' tệp tin
# dòng này ko chạy vì bị có dấu # đầu dòng
Ví dụ:
Giả sử mình xử lý tệp tin email.txt
(tạo tệp xong chép nội dung dưới đây và dán vào tệp tin.)
Amelia 555-5553 amelia.zodiacusque@gmail.com F
Broderick 555-0542 broderick.aliquotiens@yahoo.com R
Julie 555-6699 julie.perscrutabor@skeeve.com F
Samuel 555-3430 samuel.lanceolis@shu.edu A
# tìm dòng chứa chữ 'lis' trong tệp email.txt
awk '/lis/ {print}' email.txt
# mặc định là in, dòng này giống dòng trên
awk '/lis/' email.txt
# mặc định là in nguyên dòng, dòng này cũng giống dòng trên
awk '/lis/ {print $0}' email.txt # `$0` chỉ nguyên dòng, xem mục Fields
Cách ghi nội dung
xem thêm tại trang regex hoặc đặt câu hỏi cuối bài.
Record (bản ghi)
Mặc định trong một tệp tin, một bản ghi (record) là một dòng. Các bản ghi cách nhau bởi giá trị định nghĩa trong biến RS
(record separator).
Giá trị mặc định của RS
là cuối dòng (\n
, newline) và có thể gán giá trị khác.
Ví dụ, thay vì in từng dòng, lệnh sau in từng ”dòng” kết thúc bằng chữ “@”
awk '{print}' RS="@" email.txt
Field (mảng)
Chỉ từ trong một dòng cách nhau bởi khoảng trắng (giá trị của biến FS
(field separator).
$0
: nguyên dòng$1
: từ đầu tiên$1121
: từ thứ 1121$NF
: từ cuối cùng (có thể có kèm dấu chấm câu)
v.d., in dòng có chữ đầu tiên chứa chữ li
awk '$1 ~ /li/' email.txt
v.d. in “từ” đầu tiên của mỗi câutrong tệp email với giá trị phân cách FS
không phải khoảng trắng nữa mà là dấu chấm “.”
awk '{print $1}' FS="." email.txt
# Câu trên cũng có thể viết dưới dạng
awk -F. '{print $1}' email.txt
Nếu gán FS=""
có nghĩa là một ký tự trong câu sẽ trở thành một mảng vì giá trị phân cách là không có gì.
Thay đổi định dạng in
Mặc định khi in các mảng cách nhau bởi khoảng trắng (lưu trong biến OFS
: output field separator) và các bản ghi cách nhau từng dòng (lưu trong biến ORS
: output record separator)
V.d. nêu muốn in các dòng cách nhau 2 dòng trắng, chạy
awk '{print}' ORS="\n\n" mail-list.txt