11

I have a command:

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

It prints number of characters of every line in a passwd file:

52
52
61
48
81
58
etc.

How can I print the number of characters for only the first n lines?

For example - for the first 3 lines it would give something like:

52
52
61
  • @ilkkachu true. – njzk2 Mar 28 '17 at 17:07
  • If you want to ignore blank like then use below - awk '(NR<=line) && length($0) {print length($0)}' line=3 file – VIPIN KUMAR Mar 28 '17 at 19:26
18

Tell awk to quit when enough lines have been read:

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

Note that this solution ignores empty lines, although not for the line count.

  • tricky and cool! (+1) – JJoao Mar 28 '17 at 10:32
  • 2
    If any or the lines is empty, the assignment evaluates to zero (a falsy value), and the length will not be printed. – ilkkachu Mar 28 '17 at 17:03
  • @ilkkachu: Depending on the situation, it would be reasonable to ignore empty lines. I have added a note about this. – Thor Mar 28 '17 at 19:02
14

A direct Awk version (not so efficient as @Thor's), but slightly more clear:

awk 'NR <= 3 {print length}' /etc/passwd
  • 3
    If this was awk '{ print length } NR>=3 { exit }' /etc/passwd, I'd upvote it. – Dennis Williamson Mar 28 '17 at 18:08
  • 3
    @DennisWilliamson, thank you. That is a very good suggestion, I will not include it in my answer because it is already implicit in Thor's proposal. – JJoao Mar 28 '17 at 18:28
6

You can execute it with awk only command, as nicely described by @Thor, and @JJoao (+1 from me)

You can combine awk and head with parameter -n follows by the number of lines as described below:

Thanks for @Maerlyn suggestion to execute in this order: head | awk

e.g. You will get the first 3 lines using:

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

head man

-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 :) please accept the answer, when you'll be able to do it – Yaron Mar 28 '17 at 8:53
  • of course I will - in about 10 minutes ;) thanks again! – bambosze_babuni Mar 28 '17 at 8:54
  • 8
    Maybe even reverse, head -n3 /etc/passwd | awk so awk doesn't have to process the whole file. – Maerlyn Mar 28 '17 at 13:02
  • 1
    AWK can count lines, no need for head. – Dennis Williamson Mar 28 '17 at 18:09
  • @DennisWilliamson - thanks for the comment, using head was the first working solution which came to my mind. I've upvoted @Thor, @JJoao answer which uses awk only solution. – Yaron Mar 29 '17 at 6:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.