Reverse-ish a string! Your task: write a program/function that when given a string containing only ASCII characters, outputs/returns the string in reverse-ish.

Example:

1) Input

Hello, World!


2) Number unique characters in input. (Input string separated by pipes (|) for readability)

H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3   4 5 6 7   8   9 10


3) For duplicate characters, find the first occurrence of that character and number the duplicate character with the same number as the first. 

H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3 3 4 5 6 7 4 8 3 9 10


4) Reverse the string, but not the numbers.

!|d|l|r|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10


5) Delete the characters above repeat numbers. (Deleted characters represented with an asterisk.)

!|d|l|*|o|W| |,|*|l|*|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10


6) Replace the deleted characters with the character that appears over the first occurrence of the number that the deleted character is over.

!|d|l|l|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10


7) Output

!dlloW ,olleH


Test cases:

Input -&gt; Output
"Hello, World!" -&gt; "!dlloW ,olleH"
"18464399" -&gt; "99343488"
"Code Golf" -&gt; "floG eloC"
"abcdefgABCDEFG" -&gt; "GFEDCBAgfedcba"
"Mmm, marshmallows" -&gt; "swwllwmhsrwm  mms"
"15147" -&gt; "74751"
Pyth, 1 byte
X

Verify all the test cases.
Pyth has wonderful built-ins :-)

Pyth,  8  7 bytes
sm@_QxQ

Verify all the test cases.
How it works
This is the more interesting non-built-in approach.
sm@_QxQ  - Full program.

 m       - Map over the input.
  @_Q    - Get the index in the reversed input.
     xQ  - Of the first index of each character in the String.
s        - Join the list.