awk - Làm cách nào để in số lượng ký tự cho n dòng đầu tiên trong một tệp?


10

Tôi có một lệnh:

$ awk '{ print length($0); }' /etc/passwd

Nó in số lượng ký tự của mỗi dòng trong tệp passwd :

52
52
61
48
81
58
etc.

Làm cách nào tôi có thể in số lượng ký tự cho chỉ n dòng đầu tiên?

Ví dụ: đối với 3 dòng đầu tiên, nó sẽ cung cấp một cái gì đó như:

52
52
61

@ilkkachu đúng.
njzk2

Nếu bạn muốn bỏ qua khoảng trống như thế thì hãy sử dụng bên dưới - awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Câu trả lời:


17

Nói awkđể thoát khi đủ dòng đã được đọc:

awk '$0 = length; NR==3 { exit }' /etc/passwd

Lưu ý rằng giải pháp này bỏ qua các dòng trống, mặc dù không cho số lượng dòng.


khó khăn và mát mẻ! (+1)

2
Nếu bất kỳ hoặc các dòng trống, bài tập sẽ ước tính bằng không (giá trị giả) và độ dài sẽ không được in.
ilkkachu

@ilkkachu: Tùy thuộc vào tình huống, sẽ hợp lý nếu bỏ qua các dòng trống. Tôi đã thêm một lưu ý về điều này.
Thor

14

Phiên bản Awk trực tiếp (không hiệu quả như @ Thor), nhưng rõ ràng hơn một chút:

awk 'NR <= 3 {print length}' /etc/passwd

3
Nếu đây là awk '{ print length } NR>=3 { exit }' /etc/passwd, tôi sẽ nâng cấp nó.
Tạm dừng cho đến khi có thông báo mới.

3
@DennisWilliamson, cảm ơn bạn. Đó là một gợi ý rất hay, tôi sẽ không đưa nó vào câu trả lời của mình vì nó đã ẩn trong đề xuất của Thor.

5

Bạn có thể thực thi nó awkchỉ bằng lệnh, như được mô tả độc đáo bởi @Thor và @JJoao (+1 từ tôi)

Bạn có thể kết hợp awkheadvới tham số -ntheo số lượng dòng như được mô tả dưới đây:

Cảm ơn đề xuất @Maerlyn để thực hiện theo thứ tự này: head | awk

ví dụ: Bạn sẽ nhận được 3 dòng đầu tiên bằng cách sử dụng:

head -n3 /etc/passwd | awk '{ print length($0); }' 

người đứng đầu

-n, --lines=[-]K
    print the first K lines instead of the first 10; with the leading '-', print all but the last K lines of each file 

@ msjavx86 - tuyệt vời :) vui lòng chấp nhận câu trả lời, khi bạn có thể làm điều đó
Yaron

tất nhiên tôi sẽ - trong khoảng 10 phút;) cảm ơn lần nữa!
bambosze_babuni

8
Thậm chí có thể đảo ngược, head -n3 /etc/passwd | awkvì vậy awk không phải xử lý toàn bộ tệp.
Maerlyn

1
AWK có thể đếm dòng, không cần head.
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson - cảm ơn vì nhận xét, sử dụng headlà giải pháp làm việc đầu tiên xuất hiện trong đầu tôi. Tôi đã đánh giá cao @Thor, @JJoao trả lời awkchỉ sử dụng giải pháp.
Yaron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.