-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchunksort
73 lines (70 loc) · 1.94 KB
/
chunksort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#! /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(/\r\n/,"\1");
gsub(/\r/,"\1");
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'