Giả sử bạn muốn thay thế dòng 4 bằng văn bản "khác". Bạn có thể sử dụng AWK như vậy:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
AWK coi đầu vào là "bản ghi" được chia thành "các trường". Theo mặc định, một dòng là một bản ghi. NR
là số lượng hồ sơ nhìn thấy. $0
đại diện cho bản ghi hoàn chỉnh hiện tại (trong khi đó $1
là trường đầu tiên từ bản ghi, v.v. theo mặc định, các trường là các từ trong dòng).
Vì vậy, nếu số dòng hiện tại là 4, hãy in chuỗi "khác" nhưng nếu không thì in dòng không thay đổi.
Trong AWK, mã chương trình được bao quanh { }
chạy một lần trên mỗi bản ghi đầu vào.
Bạn cần trích dẫn chương trình AWK bằng dấu ngoặc đơn để giữ cho vỏ không cố gắng diễn giải những thứ như $0
.
EDIT: Một chương trình AWK ngắn và thanh lịch hơn từ @chepner trong các bình luận bên dưới:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Chỉ dành cho bản ghi (tức là dòng) số 4, thay thế toàn bộ bản ghi bằng chuỗi "khác nhau". Sau đó, cho mỗi bản ghi đầu vào, in bản ghi.
Rõ ràng các kỹ năng AWK của tôi là gỉ! Cảm ơn bạn, @chepner.
EDIT: và xem thêm một phiên bản thậm chí ngắn hơn từ @Dennis Williamson:
awk 'NR==4 {$0="different"} 1' input_file.txt
Làm thế nào điều này hoạt động được giải thích trong các ý kiến: 1
luôn luôn đánh giá đúng, vì vậy khối mã liên quan luôn chạy. Nhưng không có khối mã liên quan, có nghĩa là AWK thực hiện hành động mặc định của nó là chỉ in toàn bộ dòng. AWK được thiết kế để cho phép các chương trình ngắn gọn như thế này.