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

@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.


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

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 

@ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.