Skip to main content

Build Your Own head

This challenge is to build your own version of the Unix command line tool head. It’s a great challenge for beginners and those new to the Unix command line tools.

The Unix command line tools are a great metaphor for good software engineering and they follow the Unix Philosophies of:

  • Writing simple parts connected by clean interfaces - each tool does just one thing and provides a simple CLI that handles text input from either files or file streams.
  • Design programs to be connected to other programs - each tool can be easily connected to other tools to create incredibly powerful compositions.

Following these philosophies has made the simple Unix command line tools some of the most widely used software engineering tools - allowing us to create very complex text data processing pipelines from simple tools. There’s even a Coursera course on Data Engineering with Bash!

You can read more about the Unix Philosophy on the Coding Challenges blog.

The Challenge - Building Head

Head is a command line tool that displays the first n lines or bytes of a file, where the user can provide the value for n. If no file or value for n is provided then it displays the first 10 lines from the standard input.

Step Zero

As always the first thing to do is decide on the programming language you’re going to use to tackle this challenge and set up your development environment. Then please download the following text: https://www.gutenberg.org/cache/epub/132/pg132.txt and save it as text.txt.

Once that’s done proceed to Step 1.

Step 1

In this step your goal is to take the filename or no filename and print the contents out. Some sample test cases for this look like:

% cchead test.txt
The Project Gutenberg eBook of The Art of War

This ebook is for the use of anyone anywhere in the United States and
most other parts of the world at no cost and with almost no restrictions
whatsoever. You may copy it, give it away or re-use it under the terms
of the Project Gutenberg License included with this ebook or online
at www.gutenberg.org. If you are not located in the United States,
you will have to check the laws of the country where you are located
before using this eBook.

and:

% cchead
This is some text I typed in
This is some text I typed in
line 2
line 2
line 3
line 3
line 4
line 4
line 5
line 5
line 6
line 6
line 7
line 7
line 8
line 8
line 9
line 9
line 10
line 10

Note in this second example it is reading from the standard input and each line appears twice - the first is the echo of the standard input to the screen that bash (or whatever shell you are using - BTW you can learn more about Shells and build your own shell in another Coding Challenge) does; the second is the line from our cchead. Our implementation should terminate after line 10.

Step 2

In this step your goal is to display only the first n lines, where n is passed to the user as a command line argument. That should look like this:

% cchead -n1 test.txt
The Project Gutenberg eBook of The Art of War

Do test with different values of n and consider what will happen if there aren’t enough lines in the file. You could test that like this:

% echo "Hello, World" >> test2.txt
% cchead -n3 test2.txt
Hello, World

Make sure your program terminates correctly.

Step 3

In this step your goal is to only display the first c bytes. You can test that like this:

% cchead -c 31 test.txt
The Project Gutenberg eBook

and

% cchead -c 30 test2.txt
Hello, World

Again ensure you handle reaching the end of the file before printing the required number of characters.

Step 4

In this step your goal is to handle multiple files correctly. When multiple files are provided the output is presented, each file is preceded by a header consisting of the string ==> XXX <== where “XXX” is the name of the file. That should look like this:

% cchead -n 10 test2.txt test.txt
==> test2.txt <==
Hello, World

==> test.txt <==
The Project Gutenberg eBook of The Art of War

This ebook is for the use of anyone anywhere in the United States and
most other parts of the world at no cost and with almost no restrictions
whatsoever. You may copy it, give it away or re-use it under the terms
of the Project Gutenberg License included with this ebook or online
at www.gutenberg.org. If you are not located in the United States,
you will have to check the laws of the country where you are located
before using this eBook.

Note that up to n lines per file are output.

Once that is done, congratulations you’ve completed this Coding Challenge, why not try another more complex one?

Help Others by Sharing Your Solutions!

If you think your solution is an example other developers can learn from please share it, put it on GitHub, GitLab or elsewhere. Then let me know - ping me a message on the Discord Server, via Twitter or LinkedIn or just post about it there and tag me. Alternately please add a link to it in the Coding Challenges Shared Solutions Github repo.

Get The Challenges By Email

If you would like to recieve the coding challenges by email, you can subscribe to the weekly newsletter on SubStack here: