awk - Wie drucke ich die Anzahl der Zeichen für die ersten n Zeilen in einer Datei?

10

Ich habe einen Befehl:

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

Es gibt die Anzahl der Zeichen jeder Zeile in einer passwd- Datei aus:

52
52
61
48
81
58
etc.

Wie kann ich die Anzahl der Zeichen nur für die ersten n Zeilen drucken?

Zum Beispiel - für die ersten 3 Zeilen würde es etwas geben wie:

52
52
61
bambosze_babuni
quelle
@ilkkachu wahr.
NJZK2
Wenn Sie Leerzeichen wie ignorieren möchten, verwenden Sie unten - awk '(NR<=line) && length($0) {print length($0)}' line=3 file
VIPIN KUMAR

Antworten:

17

Sagen Sie awkzu beenden, wenn genügend Zeilen gelesen wurden:

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

Beachten Sie, dass diese Lösung leere Zeilen ignoriert, jedoch nicht für die Zeilenanzahl.

Thor
quelle
knifflig und cool! (+1)
2
Wenn eine oder die Zeilen leer sind, wird die Zuweisung mit Null (ein falscher Wert) ausgewertet, und die Länge wird nicht gedruckt.
Ilkkachu
@ilkkachu: Je nach Situation wäre es sinnvoll, leere Zeilen zu ignorieren. Ich habe einen Hinweis dazu hinzugefügt.
Thor
14

Eine direkte Awk-Version (nicht so effizient wie @ Thors), aber etwas klarer:

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

quelle
3
Wenn das so wäre awk '{ print length } NR>=3 { exit }' /etc/passwd, würde ich es positiv bewerten.
Bis auf weiteres angehalten.
3
@ TennisWilliamson, danke. Das ist ein sehr guter Vorschlag, ich werde ihn nicht in meine Antwort aufnehmen, da er bereits in Thors Vorschlag enthalten ist.
5

Sie können es awknur mit einem Befehl ausführen , wie von @Thor und @JJoao (+1 von mir) beschrieben.

Sie können awkund headmit -nfolgenden Parametern die Anzahl der Zeilen wie unten beschrieben kombinieren :

Vielen Dank für den Vorschlag von @Maerlyn, in dieser Reihenfolge auszuführen: head | awk

zB Sie erhalten die ersten 3 Zeilen mit:

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

Hauptmann

-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
quelle
@ msjavx86 - großartig :) Bitte akzeptieren Sie die Antwort, wenn Sie dazu in der Lage sind
Yaron
natürlich werde ich - in ca. 10 minuten;) nochmal danke!
bambosze_babuni
8
Vielleicht sogar umgekehrt, head -n3 /etc/passwd | awkdamit awk nicht die gesamte Datei verarbeiten muss.
Maerlyn
1
AWK kann Zeilen zählen, ohne dass dies erforderlich ist head.
Bis auf weiteres angehalten.
@ TennisWilliamson - danke für den Kommentar, mit headwar die erste funktionierende Lösung, die mir in den Sinn kam. Ich habe @Thor, @JJoao Antwort, die awknur Lösung verwendet, positiv bewertet .
Yaron