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.