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

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


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

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 

@ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.