By Frank


2010-10-25 03:55:37 8 Comments

What's the easiest/quickest way to interleave the lines of two (or more) text files? Example:

File 1:

line1.1
line1.2
line1.3

File 2:

line2.1
line2.2
line2.3

Interleaved:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

Sure it's easy to write a little Perl script that opens them both and does the task. But I was wondering if it's possible to get away with fewer code, maybe a one-liner using Unix tools?

5 comments

@Joshua Goldberg 2016-10-18 16:57:46

@Sujoy's answer points in a useful direction. You can add line numbers, sort, and strip the line numbers:

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-

Note (of interest to me) this needs a little more work to get the ordering right if instead of static files you use the output of commands that may run slower or faster than one another. In that case you need to add/sort/remove another tag in addition to the line numbers:

(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
   | sort -n  | cut -f2- | sort -n | cut -f2-

@samgak 2015-05-09 07:07:01

Here's a solution using awk:

awk '{print; if(getline < "file2") print}' file1

produces this output:

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc

Using awk can be useful if you want to add some extra formatting to the output, for example if you want to label each line based on which file it comes from:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1

produces this output:

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc

Note: this code assumes that file1 is of greater than or equal length to file2.

If file1 contains more lines than file2 and you want to output blank lines for file2 after it finishes, add an else clause to the getline test:

awk '{print; if(getline < "file2") print; else print ""}' file1

or

awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1

@Dwedit 2014-02-07 04:38:47

Here's a GUI way to do it: Paste them into two columns in a spreadsheet, copy all cells out, then use regular expressions to replace tabs with newlines.

@Sujoy 2010-10-25 04:07:32

cat file1 file2 |sort -t. -k 2.1

Here its specified that the separater is "." and that we are sorting on the first character of the second field.

@Frank 2010-10-25 14:31:00

I don't understand how this works. For example, there is no colon in the sort input? Can you explain more?

@Sujoy 2010-10-25 15:05:13

my bad, changed the ':' to '.' its just the separator, if not specified sort uses blank to separate fields. man sort for more info.

@Phil Miller 2010-10-25 15:07:12

This answer assumes the input actually takes the literal form described in the question. I think that was supposed to be illustrative. It would be possible to transform each input file that way, but it would be way more passes through the data. codaddict's answer is better.

@Sujoy 2010-10-25 15:12:23

@Novelocrat: Yep, this is just another way to do it :)

@codaddict 2010-10-25 04:01:20

paste -d '\n' file1 file2

@user667489 2015-12-03 19:14:22

N.B. on some platforms paste is rather limited - e.g. on Solaris you can have at most 12 input files, and output lines are limited to 511 characters.

@masterxilo 2018-11-20 21:12:36

And then use this together with process substitution in an example like paste -d '\n' <(find /) <(find /) and realize how much better this is than first writing the results to a file in every way, disk usage, memory usage, parallelization, cancelability...

@emallove 2018-11-22 13:55:24

Wow, paste! Going back to 1979 with AT&T UNIX 32v. Well done, sir.

Related Questions

Sponsored Content

45 Answered Questions

[SOLVED] How do I find all files containing specific text on Linux?

15 Answered Questions

7 Answered Questions

[SOLVED] How to redirect and append both stdout and stderr to a file with Bash?

18 Answered Questions

[SOLVED] Why should text files end with a newline?

20 Answered Questions

[SOLVED] How to count lines in a document?

9 Answered Questions

[SOLVED] Given two directory trees, how can I find out which files differ?

32 Answered Questions

[SOLVED] How to get full path of a file?

  • 2011-03-10 20:45:28
  • Jean
  • 862115 View
  • 670 Score
  • 32 Answer
  • Tags:   linux file unix path

Sponsored Content