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

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


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

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 

@ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.