# Read passwd files from @ARGV, outputting one record per
# username
my %users;
while (<>) {
$user = split ":",$_,1;
next if exists $users{$user};
print;
$users{$user} = 1;
}
The first time username foo is found, $users{'foo'}
does not exist, so the record is printed out, and $users{'foo'}
is set to 1. The second time username foo is found,
$users{'foo'} is now 1, so the record is skipped.
You didn't want to skip records, but rather rekey the records,
so that the duplicates have different keys -- you wanted your
outputted flat-file to have unique keys. Doing that with the
passwd example:
# Read passwd files from @ARGV, outputting one record per
# username. Duplicate usernames are renamed to be unique
my %users;
while (<>) {
$user = split ":",$_,1;
# next if exists $users{$user};
$_ = "a$_" , redo if exists $users{$user};
print;
$users{$user} = 1;
}
The $_ .= "a" , redo statement that replaces the next
appends "a" to the incoming line and then reprocesses it.
I decided to reprocess it rather than just add "a" because
if I had three user "foo" in the input files, I wouldn't
want to get users "foo", "afoo", and "afoo", I'd want "foo",
"afoo", "aafoo".
I hope this helps.
| [reply] [d/l] [select] |
I forgot to add one additional part of the problem: how will the program know which string to modify?
| [reply] |
Thanks! I'm going to test that this afternoon.
What I meant by "..which string...", was:
<CODE>
string 1 = aaa.bb.c 0/0 17 12345
string 2 = aaa.bb.c 12/12 17 12345
Just wondering which string would contain
the modified field.
eg: "aaa.bb.c.d"
<\CODE>
| [reply] |