task_boiler
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
task_boiler [2022/08/11 21:56] – [Practical solution] raju | task_boiler [2024/01/23 22:55] (current) – raju | ||
---|---|---|---|
Line 4: | Line 4: | ||
Start the first heading with " | 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 | ||
- | 8 | ||
- | 2 | ||
- | 6 | ||
- | 3 | ||
- | </ | ||
- | we want to output | ||
- | < | ||
- | value | ||
- | 2 | ||
- | 3 | ||
- | 6 | ||
- | 8 | ||
- | </ | ||
- | |||
- | We can't directly use ' | ||
- | < | ||
- | $ echo -e " | ||
- | 2 | ||
- | 3 | ||
- | 6 | ||
- | 8 | ||
- | value | ||
- | </ | ||
- | |||
- | ==== Bare bones solution ==== | ||
- | Create a script called ' | ||
- | < | ||
- | # | ||
- | # | ||
- | # 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 " | ||
- | # | ||
- | IFS= read -r header | ||
- | printf ' | ||
- | " | ||
- | </ | ||
- | |||
- | 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 | ||
- | 2 | ||
- | 3 | ||
- | 6 | ||
- | 8 | ||
- | </ | ||
- | |||
- | ==== Practical solution ==== | ||
- | I got the above script from https:// | ||
- | |||
- | A more practical approach is to clone that entire repository and add it 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 ~/ | ||
- | % cd ~/ | ||
- | |||
- | % git clone git@github.com: | ||
- | Cloning into ' | ||
- | 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=~/ | ||
- | # | ||
- | </ | ||
- | |||
- | Open a new bash session and verify that these utilities are correctly picked up. | ||
- | < | ||
- | % which body | ||
- | / | ||
- | |||
- | % which header | ||
- | / | ||
- | </ | ||
- | |||
- | Verify that the utilities are working as expected. | ||
- | < | ||
- | % echo -e " | ||
- | value | ||
- | 2 | ||
- | 3 | ||
- | 6 | ||
- | 8 | ||
- | </ | ||
- | |||
- | ==== Works with any command ==== | ||
- | The beauty of this approach is that you can use it with any unix command (and not just sort). For example, you can grep a value and it will show the header along with the value. | ||
- | < | ||
- | % echo -e " | ||
- | value | ||
- | 8 | ||
- | </ | ||
- | |||
- | ==== How I came across it ==== | ||
- | I came across it while reading the book "Data Science at the Command Line" (2nd Edition) by Jeroen Janssens (https:// |
task_boiler.1660254994.txt.gz · Last modified: 2022/08/11 21:56 by raju