My previous solution had problems with the numbering of blank lines. I have added a new solution and kept the old one further down.
New Solution
What one really needs to do is reset the counter lstnumber at the beginning of each range. To achieve this one needs to hook into an internal command \lst@SkipToFirst. One approach is to define a new key matchrangestart initialised as false via
\lst@Key{matchrangestart}{f}{\lstKV@SetIf{#1}\lst@ifmatchrangestart}
and then add the following test at the beginning of \lst@SkiptoFirst:
\lst@ifmatchrangestart\c@lstnumber=\numexpr-1+\lst@firstline\fi
This the general way listings set-up keys with true/false values and how it handles the counter lstnumber. This code says if the matchrangestart key is true then when skipping forward to the beginning of a rang set lstnumber to one less than the first line number of the range. When the line gets printed this number is then incremented before being printed so we get the desired output.

\documentclass{article}
\usepackage{filecontents,listings}
\lstset{
basicstyle=\ttfamily\footnotesize
}
\begin{filecontents*}{mycode.txt}
Line 1
Line 2
Line 3
Line 6
Line 7
Line 9
Line 10
\end{filecontents*}
\makeatletter
\lst@Key{matchrangestart}{f}{\lstKV@SetIf{#1}\lst@ifmatchrangestart}
\def\lst@SkipToFirst{%
\lst@ifmatchrangestart\c@lstnumber=\numexpr-1+\lst@firstline\fi
\ifnum \lst@lineno<\lst@firstline
\def\lst@next{\lst@BeginDropInput\lst@Pmode
\lst@Let{13}\lst@MSkipToFirst
\lst@Let{10}\lst@MSkipToFirst}%
\expandafter\lst@next
\else
\expandafter\lst@BOLGobble
\fi}
\makeatother
\begin{document}
\begin{minipage}{0.45\linewidth}
Standard
\lstset{numbers=left}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-6}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-6,8-9}]{mycode.txt}
\end{minipage}
\begin{minipage}{0.45\linewidth}
Literal
\lstset{numbers=left,matchrangestart=t}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-6}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-6,8-9}]{mycode.txt}
\end{minipage}
\end{document}
Old Solution
This places wrong numbers on blank lines
The listings package has an internal plain counter \lst@lineno holding the line number you are after. Now the numbers=left option, runs the code
\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}
so all we need to do is take this code and replace the printed latex counter \thelstnumber by \the\list@lineno:

\documentclass{article}
\usepackage{filecontents,listings}
\lstset{
basicstyle=\ttfamily\footnotesize
}
\begin{filecontents*}{mycode.txt}
Line 1
Line 2
Line 3
Line 4
Line 5
\end{filecontents*}
\makeatletter
\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\the\lst@lineno}\kern\lst@numbersep}}
\makeatother
\begin{document}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-4}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-5}]{mycode.txt}
\end{document}
The above coding sets this style globally. If you wish to have local switches then you can extend the listings definition of the numbers option, adding a leftliteral type as follows:
\documentclass{article}
\usepackage{filecontents,listings}
\makeatletter
\lst@Key{numbers}{none}{%
\let\lst@PlaceNumber\@empty
\lstKV@SwitchCases{#1}%
{none&\\%
left&\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\%
leftliteral&\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\the\lst@lineno}\kern\lst@numbersep}}\\%
right&\def\lst@PlaceNumber{\rlap{\normalfont
\kern\linewidth \kern\lst@numbersep
\lst@numberstyle{\thelstnumber}}}%
}{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
\makeatother
\lstset{
basicstyle=\ttfamily\footnotesize
}
\begin{filecontents*}{mycode.txt}
Line 1
Line 2
Line 3
Line 4
Line 5
\end{filecontents*}
\begin{document}
\begin{minipage}{0.3\linewidth}
Standard
\lstset{numbers=left}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-4}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-5}]{mycode.txt}
\end{minipage}
\begin{minipage}{0.3\linewidth}
Literal
\lstset{numbers=leftliteral}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-4}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-5}]{mycode.txt}
\end{minipage}
\begin{minipage}{0.3\linewidth}
Standard
\lstset{numbers=left}
\lstinputlisting[linerange={1-3}]{mycode.txt}
\lstinputlisting[linerange={2-4}]{mycode.txt}
\lstinputlisting[linerange={2-2,4-5}]{mycode.txt}
\end{minipage}
\end{document}

:)Thanks Andrew. – Werner Apr 23 '13 at 14:16lstsetlikeshowlines=true– is there a way to keep those as well? – k.stm Jan 12 '14 at 00:05showlinesthat are unrelated. However, the solution here doesn’t go nicely with thelstlinebgrdpackage. If one wants to keep background colors, one has to imitate its implementation and add\lst@linebgrdbetween the last two closing curly braces in the definitions of the key casesleft,leftliteral,right(andrightliteralif one has defined it), e.g.…\kern\lst@numbersep}\lst@linebgrd}\\%. – k.stm Jan 12 '14 at 14:19numbers=left,matchrangestart=tinsidenumbers=leftliteral? You seem to have completely taken out theleftliteralswitch. Is it not it going to create compatibility issues with existing documents? As a personal note, I particularly liked those words in the switch. – Masroor Oct 28 '14 at 00:31matchrangestartas this a feature orthogonal to placing of numbers. It works equally well withnumbers=right. – Andrew Swann Oct 28 '14 at 07:41