awk - Comment imprimer le nombre de caractères pour les n premières lignes d'un fichier?

10

J'ai une commande:

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

Il imprime le nombre de caractères de chaque ligne dans un fichier passwd :

52
52
61
48
81
58
etc.

Comment puis-je imprimer le nombre de caractères pour les n premières lignes seulement?

Par exemple, pour les 3 premières lignes, cela donnerait quelque chose comme:

52
52
61
bambosze_babuni
la source
@ilkkachu true.
njzk2
Si vous voulez ignorer les awk '(NR<=line) && length($0) {print length($0)}' line=3 file
espaces

Réponses:

17

Dites awkde quitter quand suffisamment de lignes ont été lues:

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

Notez que cette solution ignore les lignes vides, mais pas pour le nombre de lignes.

Thor
la source
délicat et cool! (+1)
2
Si une ou les lignes sont vides, l'affectation est évaluée à zéro (une valeur de fausseté) et la longueur ne sera pas imprimée.
Ilkkachu
@ilkkachu: Selon la situation, il serait raisonnable d'ignorer les lignes vides. J'ai ajouté une note à ce sujet.
Thor
14

Une version directe en Awk (pas aussi efficace que @ Thor's), mais un peu plus claire:

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

la source
3
Si c'était le cas awk '{ print length } NR>=3 { exit }' /etc/passwd, je le voterais.
Dennis Williamson
3
@ DennisWilliamson, merci. C'est une très bonne suggestion, je ne l'inclurai pas dans ma réponse car elle est déjà implicite dans la proposition de Thor.
5

Vous pouvez l'exécuter avec awkseulement une commande, comme bien décrit par @Thor, et @JJoao (+1 de moi)

Vous pouvez combiner awket headavec paramètre -nsuivi par le nombre de lignes comme décrit ci-dessous:

Merci pour la suggestion de @Maerlyn d’exécuter dans cet ordre: head | awk

Par exemple, vous obtiendrez les 3 premières lignes en utilisant:

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

homme à la tête

-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
la source
@ msjavx86 - super :) acceptez la réponse, s'il vous plaît , quand vous pourrez le faire
Yaron
bien sûr je vais - dans environ 10 minutes;) merci encore!
bambosze_babuni
8
Peut-être même inverser, head -n3 /etc/passwd | awkalors awk n'a pas à traiter tout le fichier.
Maerlyn
1
AWK peut compter les lignes, pas besoin de head.
Dennis Williamson
@DennisWilliamson - merci pour le commentaire, utiliser a headété la première solution de travail qui m'est venue à l'esprit. J'ai voté @Thor, @JJoao répondre qui utilise awkuniquement la solution.
Yaron