#! /bin/sh # ### chunksort - sort multi-line records (separated by single blank lines) ### Usage: chunksort [-a] [sort options] [files] ## ## chunksort - SORT CHUNKS OF TEXT SEPARATED BY BLANK LINES, LIKE THIS: ## ## Using C on the UNIX System ## By Dave Curry ## 250 pages, ISBN 0-937175-23-4 ## ## Checking C Programs with lint ## By Ian F. Darwin ## 84 pages, ISBN 0-937175-30-7 ## ## THE -a OPTION MAKES sort SORT BY LINES (SETS FIELD SEPARATOR, THE ## sort -t OPTION, TO BE CTRL-A). FOR EXAMPLE, ## ** TO SORT STARTING AT THE SECOND LINE, USE: -a +1 ## ** TO SORT STARTING AT THE FIFTH CHARACTER OF THIRD LINE: -a +2.4 ## # WORKS BY FIRST JOINING EACH CHUNK WITH A CTRL-A, LIKE THIS: # # Using C on the UNIX System^ABy Dave Curry^A250 pages, ISBN 0-937175-23-4 # Checking C Programs with lint^ABy Ian F. Darwin^A84 pages, ISBN 0-937175-30-7 # # THEN SORTING AND SPLITTING AGAIN. # # Thanks to Greg Ubben for help on this. files= sortopts= # PARSE COMMAND LINE: while : do case "$1" in "") # OUT OF ARGUMENTS (WE HOPE...) break ;; -a) # USE CTRL-A AS SORT FIELD SEPARATOR (SO CAN PICK WHICH LINE OF # THE RECORD TO SORT ON -- FOR EXAMPLE, +1 TO SORT ON LINE 2): ctrla=`echo a | tr a '\001'` sortopts="$sortopts -t$ctrla" ;; -o) # WE CAN'T PASS -o TO sort BECAUSE USER WOULD GET WRONG OUTPUT: echo "`basename $0` quitting: I don't have a -o option." 1>&2 exit 1 ;; -[Tyz]) # THE sort T, y, AND z OPTIONS HAVE AN ARGUMENT AFTER THEM. sortopts="$sortopts $1 $2" shift # GET RID OF ONE (WE'LL DO OTHER BELOW) ;; [-+]*) # SOME OTHER OPTION OR SORT FIELD: sortopts="$sortopts $1" ;; *) # IT'S A FILENAME (WE HOPE...) files="$files $1" ;; esac shift done # Change newlines into CTRL-a's, print long line with extra CTRL-a at end: gawk '{ gsub(/\n/,"\1"); print $0 "\1" } ' RS= $files | # sort that text with $sortopts from above, change CTRL-a's to newlines: sort $sortopts | tr '\1' '\12'