Lệnh Awk là một công cụ xử lý văn bản mạnh mẽ cho phép thao tác và trích xuất thông tin từ các tệp tin, đặc biệt là xử lý dữ liệu có cấu trúc như tệp nhật ký, tệp CSV và nhiều hơn nữa.
Một trong những tính năng linh hoạt nhất của Awk là khả năng in ra các trường và cột cụ thể từ một tệp tin dựa trên các phân tách đã được xác định trước.
Trong bài viết này, chúng ta sẽ tìm hiểu cách tận dụng Awk để in ra các trường và cột, cung cấp các ví dụ thực tế và lời giải thích để minh họa hiệu quả của nó.
Trong Awk, một “trường” đề cập đến một đoạn văn bản cụ thể trong một dòng, được phân tách bởi một ký tự phân tách xác định như một khoảng trống, tab hoặc dấu phẩy. Mỗi đoạn được gán một chỉ số trường, với trường đầu tiên là $1, trường thứ hai là $2, và cứ tiếp tục như vậy.
Tương tự, một “cột” đại diện cho một nhóm dọc của các trường trên nhiều dòng. Bằng cách sử dụng các khả năng của Awk, chúng ta có thể in hoặc thao tác lựa chọn các trường và cột này để trích xuất thông tin quý giá từ dữ liệu của chúng ta.
Điều quan trọng cần biết là Awk tự động chia dòng đầu vào cung cấp cho nó thành các trường, và một trường có thể được định nghĩa là một tập hợp các ký tự được tách ra khỏi các trường khác bởi một bộ phân tách trường nội bộ.
Nếu bạn quen với Unix/Linux hoặc lập trình shell bash, thì bạn nên biết biến phân tách trường nội bộ (IFS). Giá trị mặc định của IFS trong Awk là tab và khoảng trống.
Để hiểu rõ hơn về việc chỉnh sửa trường Awk này, hãy xem các ví dụ dưới đây:
Sử dụng lệnh Awk để in các trường từ tệp
Để in ra các trường cụ thể từ một tệp tin bằng Awk, bạn có thể sử dụng lệnh “print” cùng với các biến trường mong muốn.
Ví dụ, để in ra các trường thứ nhất, thứ hai và thứ ba của một tệp tin được phân tách bằng dấu phẩy, bạn có thể sử dụng lệnh sau:
awk '{print $1 "," $2 "," $3}' tecmintinfo.txt
Trường in bằng Awk
Trong lệnh trên, bạn có thể thấy các ký tự từ ba trường đầu được in ra dựa trên IFS được xác định là khoảng trống:
- Trường thứ nhất là “TecMint.com” được truy cập bằng cách sử dụng
$1
.
- Trường thứ hai là “is” được truy cập bằng cách sử dụng
$2
.
- Trường thứ ba là “the” được truy cập bằng cách sử dụng
$3
.
Một điều quan trọng cần lưu ý và luôn nhớ là việc sử dụng ($)
trong Awk khác với việc sử dụng trong lập trình shell.
Trong shell scripting, ($)
được sử dụng để truy cập giá trị của các biến, trong khi trong Awk, ($)
chỉ được sử dụng khi truy cập nội dung của một trường, không phải để truy cập giá trị của các biến.
Sử dụng Awk để in cột từ tệp
Để in ra toàn bộ các cột từ một tệp tin, chúng ta có thể sử dụng một phương pháp tương tự bằng cách chỉ định các trường mong muốn trong lệnh “print”. Tuy nhiên, lần này chúng ta xem xét nhiều dòng để đại diện cho cột.
Ví dụ, để in ra cột thứ hai và thứ ba của một tệp tin, chúng ta có thể sử dụng lệnh sau:
awk '//{print $2, $3 }' my_shopping.txt
In cột từ tệp
Awk cũng có lệnh printf
giúp bạn định dạng đầu ra một cách tốt như bạn có thể thấy đầu ra ở trên không đủ rõ ràng.
Sử dụng printf
để định dạng đầu ra của Item_Name và Unit_Price:
awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt
Sử dụng lệnh Awk để in trường và phạm vi cột từ tệp
Awk cũng cho phép chúng ta định nghĩa các phạm vi trường hoặc cột sử dụng toán tử ":"
. Ví dụ, để in các trường từ 2 đến 4 từ một tệp tin, chúng ta có thể sử dụng lệnh sau.
awk '{print $2 ":" $4}' filename
Phạm vi trường và cột in
Chỉnh sửa trường rất quan trọng khi sử dụng lệnh Awk để lọc văn bản hoặc chuỗi, nó giúp bạn lấy dữ liệu cụ thể trong các cột trong một danh sách. Và luôn nhớ rằng việc sử dụng toán tử ($)
trong Awk khác với việc sử dụng trong shell scripting.