Sometimes you need to run some UNIX command on a file but only want to operate on the body of the file, not the header. Create a file called
body
somewhere in your $PATH
, make it executable, and add this to it:#!/bin/bash
IFS= read -r header
printf '%s\n' "$header"
eval $@
Now, when you need to run something but ignore the header, use the
body
command first. For example, we can create a simple data set with a header row and some numbers:$ echo -e "header\n1\n5\n4\n7\n3"
header
1
5
4
7
3
We can pipe the whole thing to
sort
:$ echo -e "header\n1\n5\n4\n7\n3" | sort
1
3
4
5
7
header
Oops, we don’t want the header to be included in the sort. Let’s use the
body
command to operate only on the body, skipping the header:$ echo -e "header\n1\n5\n4\n7\n3" | body sort
header
1
3
4
5
7
Sure, there are other ways to solve the problem with
sort
, but body
will solve many more problems. If you have multiple header rows, just call body
multiple times.
Inspired by this post on Stack Exchange.
Why not using awk then ? You only have to call it once, whatever the number of header lines is:
ReplyDeleteExample: if your file has 4 header lines
awk 'NR>4' myfile.txt | sort
Thanks for that tip. I wonder if either one of these is faster than another? Either way, I'd rather type "body" than the awk command with special characters, but I suppose you could always alias body to awk 'NR>1' or something like that.
Delete