1

The O'Reilly Sed & Awk books says that the follow awk expression should match blank lines

/^$/ {
  print x += 1
}

But it seems to be not working with Ubuntu 17.04 mawk.
Why isn't this working?

For example:
the query on ascii.tbl text returns nothing.

~/temp$ cat ascii.tbl 
|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel|
|010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si |
|020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb|
|030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us |
|040 sp |041  ! |042  " |043  # |044  $ |045  % |046  & |047  ' |
|050  ( |051  ) |052  * |053  + |054  , |055  - |056  . |057  / |
|060  0 |061  1 |062  2 |063  3 |064  4 |065  5 |066  6 |067  7 |
|070  8 |071  9 |072  : |073  ; |074  < |075  = |076  > |077  ? |
|100  @ |101  A |102  B |103  C |104  D |105  E |106  F |107  G |
|110  H |111  I |112  J |113  K |114  L |115  M |116  N |117  O |
|120  P |121  Q |122  R |123  S |124  T |125  U |126  V |127  W |
|130  X |131  Y |132  Z |133  [ |134  \ |135  ] |136  ^ |137  _ |
|140  ` |141  a |142  b |143  c |144  d |145  e |146  f |147  g |
|150  h |151  i |152  j |153  k |154  l |155  m |156  n |157  o |
|160  p |161  q |162  r |163  s |164  t |165  u |166  v |167  w |
|170  x |171  y |172  z |173  { |174  | |175  } |176  ~ |177 del|




| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
| 20 sp | 21  ! | 22  " | 23  # | 24  $ | 25  % | 26  & | 27  ' |
| 28  ( | 29  ) | 2a  * | 2b  + | 2c  , | 2d  - | 2e  . | 2f  / |
| 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 |
| 38  8 | 39  9 | 3a  : | 3b  ; | 3c  < | 3d  = | 3e  > | 3f  ? |
| 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G |
| 48  H | 49  I | 4a  J | 4b  K | 4c  L | 4d  M | 4e  N | 4f  O |
| 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W |
| 58  X | 59  Y | 5a  Z | 5b  [ | 5c  \ | 5d  ] | 5e  ^ | 5f  _ |
| 60  ` | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g |
| 68  h | 69  i | 6a  j | 6b  k | 6c  l | 6d  m | 6e  n | 6f  o |
| 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w |
| 78  x | 79  y | 7a  z | 7b  { | 7c  | | 7d  } | 7e  ~ | 7f del|



~/temp$ awk '/^$/ {print "Blank " }' ascii.tbl 
~/temp$ 

Update: it turned out that file had CRLF line terminators. After applying dos2unix, this works.

2
  • 1
    It should print a running count of empty lines, I think: can you edit your question to include a specific example we can test? May 27, 2017 at 15:23
  • Try this easy option - awk NF ascii.tbl
    – user587469
    Feb 1, 2022 at 15:08

3 Answers 3

3

/^$/ is a condition, meaning empty lines, how deos it work? ^ means start and $ means end. so with ^$ we are looking for lines which started and has been be ended with nothing (empty lines).

After that, { print x += 1 } will be run on all these empty lines.

x is a variable, each times we add 1 to its value then we print it out. it's like { print ++x } (first add 1 to x, then print x).

so your code counts and prints the empty lines:

1
2
3
...

If your empty lines contain space you should use something like:

awk '/^\s*$/ { print "Blank " }' file
4
  • I have edited my question. please check.
    – nariknahom
    May 27, 2017 at 18:35
  • Can you give me your real file? cause edit works for me.
    – Ravexina
    May 27, 2017 at 18:38
  • @nariknahom also have a look at my update.
    – Ravexina
    May 27, 2017 at 18:40
  • 2
    it turned out that file had CRLF line terminators. After applying dos2unix, this works.
    – nariknahom
    May 27, 2017 at 18:43
2

This code just counts blank lines in a file and does its job very well without any issues.

You can use the following command for this purpose:

mawk '/^$/ { print x += 1 }' yourfile.txt

Or this one:

awk '/^$/ { print x += 1 }' yourfile.txt

The output for this command is something as follows:

1
2
3
4

But if you want to see just 4 you can use this command:

awk '!NF {s+=1} END {print s}' yourfile.txt

Or this one:

mawk '!NF {s+=1} END {print s}' yourfile.txt

This commands outputs just 4.

Footnotes : I'm using Ubuntu 17.04 and I haven't encountered any issues:

lsb_release -ds
Ubuntu 17.04
1

Maybe this is _bucking the idiom -- I use to skip:

 ("" == $0){ 
     skipped++;
     next; 
 }

Motivation ... I felt that that would be the most efficient/cleanest thing. Pattern matches are well and good -- The still take time to set-up and process. Fortunately if there is a faster method I'm covinced I will be enlightened by others.

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.