April 01, 2009, 11:33 AM — Let's explore a few unusual Unix tricks that you might not have seen before.
First, let's look at the paste command. It's more or less the opposite of the cut command which you have probably seen or used to slice some text from its input. The paste command, on the other hand, splices together input from multiple files, lining the text from each source in a side-by-side fashion. Let's look at an example.
If you have three files, each with a small amount of text on each line, for example, you can paste the files together like this:
boson> paste file1 file2 file3 alligators 1,345 xenops bears 2,890 yaks cats 3,154 zebras
The output of paste will be more or less columnar, depending on the width of each file's data. Of course, if you want to stash the output in a fourth file, you only have to redirect it.
boson> paste file1 file2 file3 > file4
Another useful "trick" is to make use of the options that come with the cat command to display unusual data in files. The -v option, for example, will display unprintable characters. If you have octal 13 characters in your file, for example, cat -v will display them as ^K characters and octal 7s as ^G.
boson> cat -v file4 A hen is only an egg's way of making another egg. Samuel Butler ^G^G^G^G^G ----- boson> cat file4 A hen is only an egg's way of making another egg. Samuel Butler -----
They would otherwise appear as a blank line at the end of the file.
If you use a -e (-ve on Solaris), line endings will be displayed with a $ as shown here:
boson> cat -ve file4 A hen is only an egg's way of making another egg.$ Samuel Butler$ ^G^G^G^G^G$
A -t (-vt on Solaris) will display tabs as ^I characters.
boson> cat -vt file4 A hen is only an egg's way of making another egg. ^ISamuel Butler ^G^G^G^G^G
And, of course, you can combine these options if you like:
boson> cat -vet file4 A hen is only an egg's way of making another egg.$ ^ISamuel Butler$ ^G^G^G^G^G$ -----$
One more. There are numerous ways to omit blank lines from text displays or to remove them from files. I've often used the beginning of line and end of line markers together like this "^$" to indicate a line with no content.
grep -v "^$" file grep -v "^$" file > newfile
An even easier way to do the same thing is to match on any character like this:
cat file | grep . cat file | grep . > newfile
Better yet, you can avoid the pipe and save a few CPU cycles:
grep . file
The "." will match on any character (but not linefeeds), so any line containing any type of content will be displayed. Plus, if you only want to see lines with more than one character or at least three characters, you can expand your matching string to "..", "..." and so on.