User Tools

Site Tools


task_boiler

This is an old revision of the document!


task boiler

Place to cook the tasks. Once they are boiled enough, move them to a separate plate.

Start the first heading with “=====”

apply unix commands to all but the first line

Situation

Let's say we want to sort a series of numbers in descending order but keep the header at the top. For example, given

$ echo -e "value\n8\n2\n6\n3"
value
8
2
6
3

we want to output

value
2
3
6
8

We can't directly use 'sort' since it will sort the header as well.

$ echo -e "value\n8\n2\n6\n3" | sort
2
3
6
8
value

Bare bones solution

Create a script called 'body' with the following contents

#!/usr/bin/env bash
#
# body: apply expression to all but the first line.
# Use multiple times in case the header spans more than one line.
#
# Example usage:
# $ echo -e "value\n8\n2\n6\n3" | body sort
#
IFS= read -r header
printf '%s\n' "$header"
"$@"

Make it executable

chmod +x body

place it somewhere in your PATH (say ~/bin)

mv body ~/bin

This script will apply any unix command to all but the first line. For example, using it on our example

$ echo -e "value\n8\n2\n6\n3" | body sort
value
2
3
6
8

Practical solution

I got the above script from https://github.com/jeroenjanssens/dsutils/blob/master/body . The underlying repository (https://github.com/jeroenjanssens/dsutils) contains many such useful scripts (ex:- header - to add, replace, and delete header lines). A more practical approach is to clone the entire repository and add the repo location to your PATH.

I did it as follows.

Remove the bare bones script we added in the previous step

% rm ~/bin/body

Clone the repository

% mkdir -p ~/github/jeroenjanssens
% cd ~/github/jeroenjanssens

% git clone git@github.com:jeroenjanssens/dsutils.git
Cloning into 'dsutils'...
remote: Enumerating objects: 62, done.
remote: Counting objects: 100% (62/62), done.
remote: Compressing objects: 100% (52/52), done.
remote: Total 62 (delta 20), reused 48 (delta 10), pack-reused 0
Receiving objects: 100% (62/62), 18.59 KiB | 9.29 MiB/s, done.
Resolving deltas: 100% (20/20), done.

Update the PATH in ~/.bashrc by adding the following lines

#------------------------------------------------------------------------------
# Add data science utils such as body, header
export PATH=~/github/jeroenjanssens/dsutils:$PATH
#------------------------------------------------------------------------------

Open a new bash session and verify that these utilities are correctly picked up.

% which body
/home/rajulocal/github/jeroenjanssens/dsutils/body

% which header
/home/rajulocal/github/jeroenjanssens/dsutils/header

Verify that the utilities are working as expected.

% echo -e "value\n8\n2\n6\n3" | body sort
value
2
3
6
8
task_boiler.1660254240.txt.gz · Last modified: 2022/08/11 21:44 by raju