Thinking of it this way, you are trying to relate the table to itself through col2, so we'll start off with a join onto itself:
select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */
Now for your aggregate. You want to aggregate all right.col1 to get the count for that column:
select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2
Which I believe should come out with the raw counts. I believe you'll have to spin over the query and get a total to get the frequency.
As a note, this would be a lot more complicated if col1 weren't constant.
Edited to add: If you are looking for one query, instead of iterating over it in whatever language you are querying from, you would need to do this grouping twice:
SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq / totals.total
FROM (SELECT
left.col1 AS col1,
COUNT(*) AS total
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY left.col1
) totals
INNER JOIN (SELECT
left.col1 AS col1,
right.col1 AS col2,
COUNT(*) AS freq
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY right.col2
) abs_freq
ON abs_freq.col1 = totals.col1