Cách in một dải cột bằng lệnh `awk`

How Print Range Columns Using Awk Command



Lệnh `awk` là một trong nhiều lệnh có thể được sử dụng để in một loạt các cột từ dữ liệu dạng bảng trong Linux. Lệnh `awk` có thể được sử dụng trực tiếp từ thiết bị đầu cuối bằng cách thực thi tệp kịch bản` awk`. Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách in một dải cột từ dữ liệu dạng bảng.

Ví dụ 1: In một dải cột từ đầu ra lệnh

Lệnh sau sẽ in các cột thứ hai, thứ ba và thứ tư từ đầu ra lệnh, ‘Ls -l ‘. Ở đây, số cột được nêu rõ ràng, nhưng lệnh hiệu quả hơn để in cùng một dải cột được hiển thị trong ví dụ tiếp theo.







$ls -NS | awk '{in $ 2, $ 3, $ 4}'

Kết quả sau được tạo ra bởi lệnh trên.





Ví dụ 2: In phạm vi cột từ tệp bằng cách sử dụng vòng

Để làm theo ví dụ này và các ví dụ khác trong hướng dẫn này, hãy tạo một tệp văn bản có tên mark.txt với nội dung sau :





ID CSE203 CSE102 CSE202
1109 78 87 79
1167 67 81 70
1190 56 61 69
1156 89 55 78
199 54 66 58

Lệnh `awk` sau đây sẽ in ba cột đầu tiên của mark.txt. Các vòng lặp được sử dụng để in các giá trị cột và vòng lặp bao gồm ba bước. Các NF biến cho biết tổng số trường hoặc cột của tệp.

$con mèomark.txt
$awk '{cho (i = 1; i<=NF-1;i++) printf $i' '; print ''}'mark.txt

Kết quả sau sẽ được tạo ra bằng cách chạy lệnh. Đầu ra cho thấy sinh viên ID và các dấu hiệu cho CSE203CSE102 .



Ví dụ 3: In phạm vi cột bằng cách xác định biến bắt đầu và biến kết thúc

Lệnh `awk` sau sẽ in ba cột đầu tiên từ đầu ra lệnh‘ ls -l ’bằng cách khởi tạo bắt đầukết thúc biến. Ở đây, giá trị của bắt đầu biến là 1 và giá trị của kết thúc biến là 3. Các biến này được lặp lại trong vòng lặp for để in ra các giá trị của cột.

$ls -NS | awk 'BEGIN {đầu tiên = 1; cuối cùng = 3}
{for (i = first; i

Kết quả sau sẽ xuất hiện sau khi chạy lệnh. Đầu ra hiển thị ba giá trị cột đầu tiên của đầu ra, ‘ls -l’.

Ví dụ 4: In một dải cột từ một tệp có định dạng

Lệnh `awk` sau sẽ in ba cột đầu tiên của mark.txt sử dụng printf và dấu tách trường đầu ra ( OFS ). Ở đây, vòng lặp for bao gồm ba bước và ba cột sẽ được in theo trình tự từ tệp. OFS được sử dụng ở đây để thêm khoảng cách giữa các cột. Khi giá trị bộ đếm của vòng lặp (i) bằng kết thúc biến, sau đó một dòng mới ( n) được tạo.

$con mèomark.txt
$awk -v bắt đầu=1 -v kết thúc=3 '{cho (i = start; i<=end;i++) printf('%s%s',
$ i, (i == end)? ' n': OFS)} '
mark.txt

Kết quả sau sẽ được tạo ra sau khi chạy các lệnh trên.

Ví dụ 5: In phạm vi cột từ tệp bằng cách sử dụng câu lệnh điều kiện

Lệnh `awk` sau sẽ in cột đầu tiên và cột cuối cùng từ một tệp bằng cách sử dụng vòng lặp for và câu lệnh if. Ở đây, vòng lặp for bao gồm bốn bước. Các bắt đầukết thúc các biến được sử dụng trong tập lệnh để bỏ qua cột thứ hai và thứ ba khỏi tệp bằng cách sử dụng điều kiện if. Biến OFS được sử dụng để thêm khoảng cách giữa các cột và biến ORS được sử dụng để thêm dòng mới ( n) sau khi in cột cuối cùng.

$con mèomark.txt
$awk -v bắt đầu=2 -v kết thúc=3 '{cho (i = 1; i<=NF;i++)
if (i> = start && i<=end) continue;
else printf ('% s% s', $ i, (i! = NF)? OFS: ORS)} '
mark.txt

Kết quả sau sẽ xuất hiện sau khi chạy các lệnh trên. Kết quả hiển thị cột đầu tiên và cột cuối cùng của mark.txt.

Ví dụ 6: In phạm vi cột từ tệp bằng biến NF

Lệnh `awk` sau sẽ in cột đầu tiên và cột cuối cùng từ tệp bằng cách sử dụng biến NF. Không có vòng lặp hoặc câu lệnh điều kiện nào được sử dụng để in giá trị cột. NF cho biết số lượng trường. Có bốn cột trong mark.txt. $ (NF-3) xác định cột đầu tiên và $ NF chỉ ra cột cuối cùng.

$con mèomark.txt
$awk '{print $ (NF-3)' '$ NF}'mark.txt

Kết quả sau được tạo ra bằng cách chạy các lệnh trên. Kết quả hiển thị cột đầu tiên và cột cuối cùng của mark.txt.

Ví dụ 7: In phạm vi cột từ tệp bằng cách sử dụng substr () và index ()

Hàm index () trả về một vị trí nếu giá trị đối số thứ hai tồn tại trong giá trị đối số đầu tiên. Hàm substr () có thể nhận ba đối số. Đối số đầu tiên là một giá trị chuỗi, đối số thứ hai là vị trí bắt đầu và đối số thứ ba là độ dài. Đối số thứ ba của substr () bị bỏ qua trong lệnh sau. Vì cột bắt đầu từ $ 1 trong lệnh `awk`, hàm index () sẽ trả về $ 3 và lệnh sẽ in từ $ 3 đến $ 4.

$con mèomark.txt
$awk '{print substr ($ 0, index ($ 0, $ 3))}'mark.txt

Kết quả sau sẽ được tạo ra bằng cách chạy các lệnh trên.

Ví dụ 8: In tuần tự một dải cột từ một tệp bằng printf

Lệnh `awk` sau đây sẽ in các cột đầu tiên, thứ hai và thứ ba của mark.txt bằng cách đặt đủ không gian cho 10 ký tự.

$con mèomark.txt
$awk '// {printf'% 10s% 10s% 10s n ', $ 1, $ 3, $ 2}'mark.txt

Kết quả sau sẽ được tạo ra bằng cách chạy các lệnh trên.

Phần kết luận

Có nhiều cách khác nhau để in phạm vi cột từ đầu ra lệnh hoặc tệp. Hướng dẫn này cho thấy cách lệnh `awk` có thể giúp người dùng Linux in nội dung từ dữ liệu dạng bảng.