awk - Bagaimana cara mencetak jumlah karakter untuk n baris pertama dalam file?

10

Saya punya perintah:

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

Ini mencetak jumlah karakter dari setiap baris dalam file passwd :

52
52
61
48
81
58
etc.

Bagaimana saya bisa mencetak jumlah karakter hanya untuk n baris pertama?

Sebagai contoh - untuk 3 baris pertama akan memberikan sesuatu seperti:

52
52
61
bambosze_babuni
sumber
@ilkkachu benar.
njzk2
Jika Anda ingin mengabaikan kosong seperti maka gunakan di bawah ini - awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Jawaban:

17

Katakan awkuntuk berhenti ketika baris sudah cukup dibaca:

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

Perhatikan bahwa solusi ini mengabaikan garis kosong, meskipun tidak untuk jumlah baris.

Thor
sumber
rumit dan keren! (+1)
2
Jika ada atau baris kosong, tugas mengevaluasi ke nol (nilai palsu), dan panjangnya tidak akan dicetak.
ilkkachu
@ilkkachu: Bergantung pada situasinya, masuk akal untuk mengabaikan baris kosong. Saya telah menambahkan catatan tentang ini.
Thor
14

Versi bahasa Inggris langsung (tidak seefisien @ Thor), tetapi sedikit lebih jelas:

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

sumber
3
Jika ini benar awk '{ print length } NR>=3 { exit }' /etc/passwd, saya akan membatalkannya.
Dijeda sampai pemberitahuan lebih lanjut.
3
@ DennisWilliamson, terima kasih. Itu saran yang sangat bagus, saya tidak akan memasukkannya dalam jawaban saya karena sudah tersirat dalam proposal Thor.
5

Anda dapat menjalankannya awkhanya dengan perintah, sebagaimana dijelaskan dengan baik oleh @Thor, dan @JJoao (+1 dari saya)

Anda dapat menggabungkan awkdan headdengan parameter -nberikut dengan jumlah baris seperti yang dijelaskan di bawah ini:

Terima kasih atas saran @Merlyn untuk mengeksekusi dalam urutan ini: head | awk

mis. Anda akan mendapatkan 3 baris pertama menggunakan:

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

kepala manusia

-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 
Yaron
sumber
@ msjavx86 - bagus :) tolong terima jawabannya, ketika Anda bisa melakukannya
Yaron
tentu saja saya akan - dalam sekitar 10 menit;) terima kasih lagi!
bambosze_babuni
8
Mungkin bahkan mundur, head -n3 /etc/passwd | awkjadi awk tidak harus memproses seluruh file.
Maerlyn
1
AWK dapat menghitung garis, tidak perlu head.
Dijeda sampai pemberitahuan lebih lanjut.
@ DennisWilliamson - terima kasih atas komentarnya, menggunakan headadalah solusi kerja pertama yang muncul di pikiran saya. Saya telah memutakhirkan @Thor, jawaban @JJao yang awkhanya menggunakan solusi.
Yaron