Cách sử dụng Awk để lọc dữ liệu bằng cách sử dụng ký tự $
Trong bài này mình sẽ hướng dẫn sử dụng Awk trong Linux để in ra thông tin các trường và cột của một file trên Linux.
Có thể trong một bảng bạn chỉ cần lấy thông tin của 2 hoặc 3 cột, và awk có một tính năng giúp bạn làm được điều đó. Hãy cùng mình bắt đầu vào tutorial ngày hôm nay nha.
Nếu bạn đã quen thuộc với Linux hay bash shell thì bạn có thể bạn đã biết internal field separator (IFS). Nếu không thì đơn giản bạn có thể hiểu IFS trong awk được xem như là tab hoặc là khoảng cách (space) và đó cũng chính là khoảng ngăn cách giữa các ký tự, đây là cách hoạt động của việc chia tách trường trong awk.
1. Ví dụ 1
Mình có một file demo1.txt
như sau:
Bài viết này được đăng tại [free tuts .net]
Mình sẽ in ra 3 trường 1, 2 và 3 bằng cách dùng bằng awk như sau:
awk '//{print $1 $2 $3 }' demo1.txt
Và bạn có thể thêm lần lượt $4 $5 để lấy thêm trường, mỗi trường đều cách nhau bằng khoảng cách hoặc là một tab và phân chia nhau rõ ràng.
Mình tóm tắt lại 1 chút:
- Trường 1 là William được truy cập vào khi sử dụng $1
- Trường 2 là Henry được truy cập vào khi sử dụng $2
- Trường 3 là “Bill" được truy cập khi sử dụng $3
- Lần lượt mình có thể sử dụng $4 $5 để truy cập tiếp theo
Như bạn thấy, khi mình in dữ liệu ra thì không có khoảng cách và đó chính là cách in mặc định của awk.
Bạn có thể thêm dấu phẩy ( , ) ở mỗi trường để hiển thị một cách rõ ràng hơn.
awk '//{print $1, $2, $3; }' demo1.txt
Một chú ý quan trọng và luôn luôn phải ghị nhớ là cách sử dụng ký tự đô la ( $ ) trong awk sẽ khác cách sử dụng trong shell script.
Trong shell scripting thì ($) được sử dụng để truy cập giá trị của biến. Trong khi đó awk chỉ sử dụng để truy cập nội dung của một trường nhưng không được sử dụng để truy cập giá trị của một biến.
2. Ví dụ 2
Tiếp tục làm thêm một ví dụ nữa để bạn hiểu rõ hơn nha.
Mình có file demo2.txt
Mình ví dụ ở đây có rất nhiều trường nhưng bạn chỉ quan tâm là nó tên là gì và giá bao nhiêu, những trường khác bạn không quan tâm thì tại sao bạn lại cần hiển thị đúng không? Và đây là giải pháp
awk '//{print $2, $3 }' demo2.txt
Thông tin hiển thị ra đã khá ok nhưng cũng chưa được rõ lắm. Bây giờ bạn có thể sử dụng awk và thêm vài thông số như sau.
awk '//{printf "%-20s %s\n",$2, $3 }' demo2.txt
Khá xịn phải không nào :)
Lệnh printf là lệnh giúp bạn giúp bạn format lại định dạng hiển thị dữ liệu theo một cách riêng nào đó.
Các bạn có thể thực hành bằng cách tải các file trong link github sau: https://github.com/AnTienTL/awk-learning
Lời kết: Chỉnh sửa trường là điều rất quan trọng khi sử dụng awk để lọc những đoạn văn bản, giúp loại bỏ những thông tin dư thừa, Và một lần nữa mình muốn nhấn mạnh rằng cách sử dụng ( $ ) trong awk thì sẽ luôn khác cách sử dụng ( $ ) trong shell scripting.