diff --git a/src/sort.c b/src/sort.c
index 7e25f6a..c72daff 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -441,6 +441,7 @@ Other options:\n\
       fputs (_("\
   -k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2\n\
                             (default end of line).  See POS syntax below\n\
+  -l, --skip-lines=NUM      skip NUM number of lines from each file before sorting\n\
   -m, --merge               merge already sorted files; do not sort\n\
 "), stdout);
       fputs (_("\
@@ -501,7 +502,7 @@ enum
   PARALLEL_OPTION
 };
 
-static char const short_options[] = "-bcCdfghik:mMno:rRsS:t:T:uVy:z";
+static char const short_options[] = "-bcCdfghik:l:mMno:rRsS:t:T:uVy:z";
 
 static struct option const long_options[] =
 {
@@ -515,6 +516,7 @@ static struct option const long_options[] =
   {"general-numeric-sort", no_argument, NULL, 'g'},
   {"ignore-nonprinting", no_argument, NULL, 'i'},
   {"key", required_argument, NULL, 'k'},
+  {"skip-lines",required_argument,NULL,'l'},
   {"merge", no_argument, NULL, 'm'},
   {"month-sort", no_argument, NULL, 'M'},
   {"numeric-sort", no_argument, NULL, 'n'},
@@ -1390,6 +1392,18 @@ specify_nthreads (int oi, char c, char const *s)
   return nthreads;
 }
 
+/* Specify the number of lines to skip before sorting.  */
+static unsigned long int
+specify_nline_skip (int oi, char c, char const *s)
+{
+  unsigned long int nline_skip;
+  enum strtol_error e = xstrtoul (s, NULL, 10, &nline_skip, "");
+  if (e == LONGINT_OVERFLOW)
+    return ULONG_MAX;
+  if (e != LONGINT_OK)
+    xstrtol_fatal (e, oi, c, long_options, s);
+  return nline_skip;
+}
 
 /* Return the default sort size.  */
 static size_t
@@ -3687,7 +3701,7 @@ merge (struct sortfile *files, size_t ntemps, size_t nfiles,
 
 static void
 sort (char * const *files, size_t nfiles, char const *output_file,
-      unsigned long int nthreads)
+      unsigned long int nthreads, unsigned long int  nline_skip)
 {
   struct buffer buf;
   size_t ntemps = 0;
@@ -3753,6 +3767,12 @@ sort (char * const *files, size_t nfiles, char const *output_file,
               ++ntemps;
               temp_output = create_temp (&tfp, NULL);
             }
+          for(size_t i=0;i<nline_skip;i++)
+            {
+              write_unique(line-(1+i),tfp,temp_output);
+            }
+          buf.nlines-=nline_skip;
+          line-=nline_skip;
           if (1 < buf.nlines)
             {
               struct merge_node_queue merge_queue;
@@ -3990,6 +4010,7 @@ main (int argc, char **argv)
   bool need_random = false;
   unsigned long int nthreads = 0;
   size_t nfiles = 0;
+  unsigned long int nline_skip = 0;
   bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
   bool obsolete_usage = (posix2_version () < 200112);
   char **files;
@@ -4267,6 +4288,10 @@ main (int argc, char **argv)
           insertkey (key);
           break;
 
+        case 'l':
+          specify_nline_skip(oi,c,optarg);
+          break;
+
         case 'm':
           mergeonly = true;
           break;
@@ -4534,7 +4559,7 @@ main (int argc, char **argv)
       if (!nthreads || nthreads > np2)
         nthreads = np2;
 
-      sort (files, nfiles, outfile, nthreads);
+      sort (files, nfiles, outfile, nthreads, nline_skip);
     }
 
   if (have_read_stdin && fclose (stdin) == EOF)
