awk - Jak wydrukować liczbę znaków dla pierwszych n wierszy w pliku?

10

Mam polecenie:

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

Wyświetla liczbę znaków każdej linii w pliku passwd :

52
52
61
48
81
58
etc.

Jak wydrukować liczbę znaków tylko dla pierwszych n wierszy?

Na przykład - dla pierwszych 3 wierszy dałoby coś takiego:

52
52
61
bambosze_babuni
źródło
@ilkkachu true.
njzk2
Jeśli chcesz zignorować puste, użyj poniższych awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Odpowiedzi:

17

Powiedz, awkżeby wyjść, gdy przeczytano wystarczającą liczbę linii:

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

Zauważ, że to rozwiązanie ignoruje puste linie, chociaż nie dla ich liczby.

Thor
źródło
trudne i fajne! (+1)
2
Jeśli którykolwiek lub wiersz jest pusty, przypisanie jest oceniane na zero (wartość fałszowania), a długość nie zostanie wydrukowana.
ilkkachu
@ilkkachu: W zależności od sytuacji rozsądne byłoby zignorowanie pustych linii. Dodałem notatkę na ten temat.
Thor
14

Bezpośrednia wersja Awk (nie tak wydajna jak @ Thor), ale nieco bardziej przejrzysta:

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

źródło
3
Gdyby tak było awk '{ print length } NR>=3 { exit }' /etc/passwd, głosowałbym za tym.
Wstrzymano do odwołania.
3
@DennisWilliamson, dziękuję. To bardzo dobra sugestia, nie uwzględnię jej w mojej odpowiedzi, ponieważ jest ona już domyślna w propozycji Thora.
5

Możesz go wykonać awktylko poleceniem, jak to dobrze opisali @Thor i @JJoao (+1 ode mnie)

Możesz łączyć awki za headpomocą parametru -nnastępującą liczbę linii, jak opisano poniżej:

Dziękujemy za sugestię @ Maerlyn do wykonania w tej kolejności: head | awk

np. Otrzymasz pierwsze 3 linie używając:

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

głowa człowieka

-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
źródło
@ msjavx86 - świetnie :) zaakceptuj odpowiedź, kiedy będziesz w stanie to zrobić
Yaron
oczywiście, że tak - za około 10 minut;) jeszcze raz dziękuję!
bambosze_babuni
8
Może nawet odwrotnie, head -n3 /etc/passwd | awkwięc awk nie musi przetwarzać całego pliku.
Maerlyn
1
AWK może liczyć wiersze, bez potrzeby head.
Wstrzymano do odwołania.
@DennisWilliamson - dzięki za komentarz, headpierwsze użyteczne rozwiązanie przyszło mi do głowy. Poprosiłem o odpowiedź na @Thor, @JJoao, która używa awktylko rozwiązania.
Yaron