awk - Como imprimir o número de caracteres para as primeiras n linhas em um arquivo?

10

Eu tenho um comando:

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

Ele imprime o número de caracteres de cada linha em um arquivo passwd :

52
52
61
48
81
58
etc.

Como posso imprimir o número de caracteres apenas para as primeiras n linhas?

Por exemplo - nas 3 primeiras linhas, seria algo como:

52
52
61
bambosze_babuni
fonte
@ilkkachu true.
Njzk2 28/03
Se você deseja ignorar o espaço em branco como, em seguida, use abaixo - awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Respostas:

17

Diga awkpara sair quando linhas suficientes forem lidas:

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

Observe que esta solução ignora linhas vazias, embora não para a contagem de linhas.

Thor
fonte
complicado e legal! (+1)
2
Se alguma ou as linhas estiverem vazias, a atribuição será avaliada como zero (um valor falso), e o comprimento não será impresso.
ilkkachu
@ilkkachu: Dependendo da situação, seria razoável ignorar as linhas vazias. Eu adicionei uma observação sobre isso.
Thor
14

Uma versão direta do Awk (não tão eficiente quanto a de Thor), mas um pouco mais clara:

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

fonte
3
Se fosse isso awk '{ print length } NR>=3 { exit }' /etc/passwd, eu votaria.
Pausado até novo aviso.
3
@DennisWilliamson, obrigado. Essa é uma sugestão muito boa, não a incluirei na minha resposta, porque ela já está implícita na proposta de Thor.
5

Você pode executá-lo awkapenas com o comando, como bem descrito por @Thor e @JJoao (+1 de mim)

Você pode combinar awke headcom o parâmetro a -nseguir pelo número de linhas, conforme descrito abaixo:

Obrigado pela sugestão do @Maerlyn para executar nesta ordem: head | awk

Por exemplo, você obterá as 3 primeiras linhas usando:

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

homem cabeça

-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
fonte
@ msjavx86 - great :) por favor aceitar a resposta, quando você vai ser capaz de fazê-lo
Yaron
é claro que vou - em cerca de 10 minutos;) obrigado novamente!
bambosze_babuni
8
Talvez até inverter, head -n3 /etc/passwd | awkpara que o awk não precise processar o arquivo inteiro.
Merlim
1
O AWK pode contar linhas, sem necessidade head.
Pausado até novo aviso.
@DennisWilliamson - obrigado pelo comentário, usando headfoi a primeira solução de trabalho que me veio à mente. Votou @Thor, @JJoao resposta que usa awkapenas solução.
Yaron 29/03