Eu sei que você não queria uma solução perl, mas aqui está uma de qualquer maneira.
Tem a vantagem que pode manipular se os comandos permitidos estiverem em ordem diferente.
Então, NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser
é tratado como igual a NOPASSWD:/usr/bin/chuser,/usr/bin/pwdadm,/usr/bin/chsec
#!/bin/perl
use strict;
use warnings;
my %hash;
# reads all lines from STDIN
while(<>) {
chomp; # removes leading/trailing whitespace
#splits the input string on whitespace
my ($user, undef, undef, $cmds) = split;
# pulls out list of allowed commands
my($NP, $cmdlist) = split(/:/, $cmds);
# Sorts the list of commands and puts it together again
$cmds = "$NP:".join(',', sort split(/,/, $cmdlist));
# if the command exists in the hash with a user
# add the nest user else just adds user
$hash{$cmds} = $hash{$cmds}? "$hash{$cmds} $user" : $user;
}
# print all
foreach my $key (keys %hash) {
print "$key | ", $hash{$key} ,"\n";
}