The single line 0 9 1 * 5 is the right collapse: Vixie and cronie OR the two restricted day fields and fire once. The next example is a different set.
This only runs when the 1st falls on a weekday:
0 9 * * 1-5 [ "$(date +\%d)" -eq 1 ] && /usr/local/bin/job
It does not run on a Friday the 2nd through the 31st, and it also skips a Saturday or Sunday the 1st, which 0 9 1 * 5 still runs because the day-of-month field matched. So it is not a once-only version of the two-line schedule.
To keep that union and still run once, the day fields in the crontab have to be stars and the check has to live in the command. && and || are left-associative and equal precedence, so this is (day-is-1 OR Friday) and then the job:
0 9 * * * [ "$(date +\%d)" -eq 1 ] || [ "$(date +\%u)" -eq 5 ] && /usr/local/bin/job
date +%u is 1-7, Monday through Sunday, so 5 is Friday. That avoids the crontab quirk where both 0 and 7 mean Sunday while date +%w only ever prints 0.
One test hazard: * * 31 * 3 really is every minute of that Wednesday. Fine for a one-minute check, but the line is live until it is deleted.