add another one useful for .profile
[shellsnippets/shellsnippets.git] / mksh / fccombine
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/fccombine,v 1.1 2013/11/23 14:20:53 tg Exp $
3 #-
4 # Copyright © 2013
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Combine files on their first column. Example:
23 #       <wsp*>foo<wsp+>bar<wsp*><nl>
24 #       <wsp*>foo<wsp+>baz<wsp*><nl>
25 #       <wsp*>bla<wsp+>moo<wsp*><nl>
26 # will become:
27 #       foo<tab>bar<tab>baz<nl>
28 #       bla<tab>moo<nl>
29 # A line with no second column will also skip the tab. An empty line
30 # will separate output but be otherwise ignored.
31
32 IFS=$' \t\n\r\f\v'
33 last=
34 while read -r first rest; do
35         if [[ $first != "$last" ]]; then
36                 [[ -n $last ]] && print
37                 last=$first
38                 print -nr -- "$first"
39         fi
40         [[ -n $rest ]] && print -nr -- $'\t'"$rest"
41 done
42 [[ -n $last ]] && print