Odd Even Lines

Split text into odd-numbered lines (1, 3, 5…) and even-numbered lines (2, 4, 6…).

Back to all tools on ToolForge

More in Text Tools

Input



Odd Lines (1, 3, 5…)

Even Lines (2, 4, 6…)

About Odd Even Lines

This tool splits text into odd-numbered lines and even-numbered lines based on their position in the input. Line 1 (the first line) is considered odd. The splitting uses modulo arithmetic to determine line placement: lines where (position-1) % 2 === 0 go to odd output, others go to even output.

It is useful for separating keys from values in paired data, extracting alternating record types from logs, splitting interleaved data streams, separating questions from answers, and processing output from tools that alternate between different data types.

Line Splitting Algorithm

The tool uses index-based separation to split lines:

Algorithm:

1. Split input by line breaks (LF or CRLF)
   lines = input.split(/\r?\n/)

2. Initialize two output arrays
   oddLines = []
   evenLines = []

3. For each line at index i (0-based):
   if i % 2 === 0:
     oddLines.push(line)    // Lines 1, 3, 5... (0-indexed: 0, 2, 4)
   else:
     evenLines.push(line)   // Lines 2, 4, 6... (0-indexed: 1, 3, 5)

4. Join arrays with newlines
   oddOutput = oddLines.join("\n")
   evenOutput = evenLines.join("\n")

Index Mapping:
  Input Index | Line Number | Output
  ------------|-------------|--------
  0           | 1           | Odd
  1           | 2           | Even
  2           | 3           | Odd
  3           | 4           | Even
  4           | 5           | Odd
  5           | 6           | Even

JavaScript Implementation:
  function splitOddEven(lines) {
    const odd = [];
    const even = [];
    lines.forEach((line, index) => {
      if (index % 2 === 0) {
        odd.push(line);
      } else {
        even.push(line);
      }
    });
    return { odd, even };
  }

Example Walkthrough

Example Input (6 lines):
  Line 1: Name: John
  Line 2: Age: 30
  Line 3: City: New York
  Line 4: Country: USA
  Line 5: Phone: 555-1234
  Line 6: Email: [email protected]

Processing:
  Index 0 (Line 1) → Odd:  "Name: John"
  Index 1 (Line 2) → Even: "Age: 30"
  Index 2 (Line 3) → Odd:  "City: New York"
  Index 3 (Line 4) → Even: "Country: USA"
  Index 4 (Line 5) → Odd:  "Phone: 555-1234"
  Index 5 (Line 6) → Even: "Email: [email protected]"

Odd Output (Lines 1, 3, 5):
  Name: John
  City: New York
  Phone: 555-1234

Even Output (Lines 2, 4, 6):
  Age: 30
  Country: USA
  Email: [email protected]

Result: Key-value pairs separated!
  Odd contains keys, Even contains values

Common Use Cases

Use Case Description Example
Key-Value Separation Extract keys and values from paired data Line 1: key, Line 2: value
Log File Analysis Separate alternating log entry types Header lines vs data lines
Q&A Extraction Split questions from answers FAQ data, interview transcripts
Data Stream Processing Separate interleaved data sources Sensor A / Sensor B readings
List Transformation Convert alternating lists to columns Item names and prices
Code Processing Separate code from comments Alternating code/comment format

Code Examples by Language

JavaScript:
  // Split into odd and even lines
  function splitOddEven(text) {
    const lines = text.split(/\r?\n/);
    const odd = lines.filter((_, i) => i % 2 === 0);
    const even = lines.filter((_, i) => i % 2 === 1);
    return { odd: odd.join("\n"), even: even.join("\n") };
  }

Python:
  # Split into odd and even lines
  def split_odd_even(text):
      lines = text.splitlines()
      odd = lines[0::2]   # Start at 0, step by 2
      even = lines[1::2]  # Start at 1, step by 2
      return odd, even

  # Using enumerate
  def split_odd_even(text):
      odd, even = [], []
      for i, line in enumerate(text.splitlines()):
          if i % 2 == 0:
              odd.append(line)
          else:
              even.append(line)
      return odd, even

Bash/sed:
  # Extract odd lines (1, 3, 5...)
  sed -n '1~2p' file.txt

  # Extract even lines (2, 4, 6...)
  sed -n '2~2p' file.txt

  # Using awk
  awk 'NR%2==1' file.txt  # Odd lines
  awk 'NR%2==0' file.txt  # Even lines

PowerShell:
  # Odd lines
  Get-Content file.txt | Where-Object { $i++ % 2 -eq 0 }

  # Even lines
  Get-Content file.txt | Where-Object { $i++ % 2 -eq 1 }

PHP:
  // Split into odd and even lines
  function splitOddEven($text) {
      $lines = preg_split('/\r\n|\r|\n/', $text);
      $odd = [];
      $even = [];
      foreach ($lines as $i => $line) {
          if ($i % 2 === 0) {
              $odd[] = $line;
          } else {
              $even[] = $line;
          }
      }
      return [implode("\n", $odd), implode("\n", $even)];
  }

Java:
  // Using streams (Java 8+)
  List lines = Files.lines(path).collect(toList());
  List odd = IntStream.range(0, lines.size())
      .filter(i -> i % 2 == 0)
      .mapToObj(lines::get)
      .collect(toList());
  List even = IntStream.range(0, lines.size())
      .filter(i -> i % 2 == 1)
      .mapToObj(lines::get)
      .collect(toList());

Splitting Examples

Example 1: Simple Alternating Data
  Input:
    Apple
    Red
    Banana
    Yellow
    Grape
    Purple

  Odd (1, 3, 5):
    Apple
    Banana
    Grape

  Even (2, 4, 6):
    Red
    Yellow
    Purple

  Result: Fruits separated from colors!

Example 2: Key-Value Pairs
  Input:
    First Name
    Smith
    Last Name
    John
    ID
    12345

  Odd (1, 3, 5):
    First Name
    Last Name
    ID

  Even (2, 4, 6):
    Smith
    John
    12345

  Result: Keys separated from values!

Example 3: Questions and Answers
  Input:
    Q: What is your name?
    A: John Doe
    Q: What is your age?
    A: Thirty

  Odd (1, 3):
    Q: What is your name?
    Q: What is your age?

  Even (2, 4):
    A: John Doe
    A: Thirty

  Result: All questions in one list, all answers in another!

Example 4: With Empty Lines
  Input:
    Header 1

    Header 2

    Header 3

  Odd (1, 3, 5):
    Header 1
    Header 2
    Header 3

  Even (2, 4, 6):




  Result: Empty lines preserved in their respective outputs!

Example 5: Single Line
  Input:
    Only line

  Odd (1):
    Only line

  Even:
    (empty)

  Result: Single line goes to odd output!

Example 6: Sensor Data
  Input:
    Temp: 72°F
    Humidity: 45%
    Temp: 73°F
    Humidity: 47%
    Temp: 71°F
    Humidity: 44%

  Odd (1, 3, 5):
    Temp: 72°F
    Temp: 73°F
    Temp: 71°F

  Even (2, 4, 6):
    Humidity: 45%
    Humidity: 47%
    Humidity: 44%

  Result: Temperature readings separated from humidity readings!

Related Operations

Every Nth Line Extraction:

  Extract every 3rd line:
  JavaScript: lines.filter((_, i) => i % 3 === 0)
  Python: lines[0::3]
  Bash: sed -n '1~3p' file.txt

  Extract every 4th line:
  JavaScript: lines.filter((_, i) => i % 4 === 0)
  Python: lines[0::4]
  Bash: sed -n '1~4p' file.txt

Reverse Operation (Interleave):
  Combine two lists by alternating:

  JavaScript:
    function interleave(odd, even) {
      const result = [];
      const max = Math.max(odd.length, even.length);
      for (let i = 0; i < max; i++) {
        if (i < odd.length) result.push(odd[i]);
        if (i < even.length) result.push(even[i]);
      }
      return result.join("\n");
    }

  Python:
    from itertools import zip_longest
    def interleave(odd, even):
        result = []
        for o, e in zip_longest(odd, even):
            if o: result.append(o)
            if e: result.append(e)
        return "\n".join(result)

Line Numbering:
  Add line numbers to output:

  JavaScript:
    lines.map((l, i) => `${i + 1}: ${l}`).join("\n")

  Python:
    "\n".join(f"{i+1}: {line}" for i, line in enumerate(lines))

Best Practices

Limitations

Frequently Asked Questions

How does the odd/even line splitting work?
The tool splits input text by line breaks and separates lines based on their position. Lines at positions 1, 3, 5... (0-indexed: 0, 2, 4...) go to odd output. Lines at positions 2, 4, 6... (0-indexed: 1, 3, 5...) go to even output. This uses modulo arithmetic: line % 2 === 0 means odd position.
Why is line 1 considered odd?
Line numbering starts at 1 (not 0) for human readability. Line 1 is the first line, which is an odd number. In programming, arrays are 0-indexed, so line 1 is at index 0. The tool uses 1-based numbering for the output labels to match user expectations.
What are common use cases for splitting odd/even lines?
Common uses include: separating keys from values in paired data, extracting alternating record types from logs, splitting interleaved data streams, separating questions from answers, and processing output from tools that alternate between different data types.
How are empty lines handled?
Empty lines are preserved and counted in the line sequence. An empty line at position 3 goes to the odd output. An empty line at position 4 goes to the even output. This maintains the original structure and line relationships.
Can I extract only odd or only even lines?
This tool produces both outputs simultaneously. To get only odd or even lines, copy the desired output and discard the other. For repeated single-extraction needs, consider using command-line tools like awk 'NR%2==1' for odd or awk 'NR%2==0' for even.
What happens with a single-line input?
A single line goes to the odd output (as line 1). The even output will be empty. This is correct because there is no line 2 (even) in a single-line input.