BEGIN {
	FS = ":"
	exit_status = 0
	all = 0 
	newatt = 0
	compare[0] = ""
	field_name[0] = ""

#
# load up the columns to be unique
#

getline < "/tmp/db.rules"


if ($1 == "") { 
	printf("No rules specified\n\n") > "/dev/tty"
	exit_status=1
	}
else { 	
	number_columns = split($1, command, " ")
	}

for (i=1;i<=number_columns;i++) {
	if (command[i] == "all" || command[i] == "ALL") { 
		all = 1 
		field_name[0] = " all"}
	}


#
# load field names for query sorting
#

getline < "/tmp/db.fields"


for (i=1; i<=NF; i++) {
     	field_number[$i]=i
  	}
#
# create the new awk query string
#


for (i=1;i<=number_columns; i++) {
	if ( ! field_number[command[i]] && all==0 ) {
		printf("Unknown field %s, please try again\n", command[i]) > "/dev/tty"
		exit_status = 1
		exit 1
	}
	else 	{
		if ( all==0 ) {
			field_name[i] = command[i]
			field_name[0]=field_name[0] " " field_name[i]
			command[i] = sprintf ("%s",field_number[command[i]])
			}
		}
	}
}

#
# load the att, cat,
# cat all columns >= $3 into one string data[NR]
# cat all search columns into one string compare[NR]
# output to a tmp file for sorting on the search columns
# if a field is blank, insert !, so that the sort works
#
{ 
if (exit_status == 0) {
	att[NR]=$1
	cat[NR]=$2
	data[NR] = $3
	for (i=4; i<=NF; i++) {
		data[NR] = data[NR] ":" $i
		}
	if (all == 1) {
		for (i=3;i<=NF;i++) {
			if ($i == "") {
				compare[NR] = compare[NR] ": "
				}
			else {
				compare[NR] = compare[NR] ":" $i
				}
			}
		}
	else {
		for (i=1;i<=number_columns;i++) {
			if ($command[i] == "") {
				compare[NR] = compare[NR] ": "
				}
			else {
				compare[NR] = compare[NR] ":" $command[i]
				}
			}
		}
	printf("%d:%d:%s\n", NR, att[NR], compare[NR]) > "/tmp/uniq.sort.in"
	}
}


END {
if (exit_status == 1) { exit 1 }

#
# initialize variables and sort the relavent columns
#

else {
	number_records=NR - 2
	compare[0]=""
	check_number=0
	
	system("sort -t':' +2  /tmp/uniq.sort.in > /tmp/uniq.sort.out")

#
# for each line, test if compare[] = the last compare[]
# if so, maintain new att number, else increment the new att
#

	for (i=1; i<=number_records; i++) {

		getline < "/tmp/uniq.sort.out"

		if (compare[$1] != compare[check_number]) {
			newatt = newatt + 1 
			}
#
# several different options for new category format
#
#       printf("%d = %d %s%s\n", att[$1], newatt, cat[$1], compare[$1]) > "/tmp/uniq.reclass"
#       printf("%d = %d %s%s\n", att[$1], newatt, cat[$1], data[$1]) > "/tmp/uniq.reclass"
        printf("%d = %d %s%s\n", att[$1], newatt, field_name[0], compare[$1])

		check_number = $1
		}
	}
}
