Shell – Intersperse lines from two files

pasteshell-scripttext processing

I have a data file ($file1) which contains two lines of data per individual. I need to intersperse a third line of data from another data file ($file2). So my input looks like:

>cat $file1
  bob  1  1  0
  bob  1  0  1
  alan 0  0  1
  alan 0  1  1

>cat $file2
 bob  a  a  b
 alan a  c  a

So the desired result would be:

>cat $file3
  bob  1  1  0
  bob  1  0  1
  bob  a  a  b
  alan 0  0  1
  alan 0  1  1
  alan a  c  a

If I just needed to intersperse every other line I would have used paste like so:

>paste '-d\n' $file1 $file2

What would be the best tool to use to achieve this? I am using zsh.

Best Answer

Just:

paste -d '\n' -- - - "$file2" < "$file1"

(provided $file2 is not -).

Or with GNU sed, provided $file2 (the variable content, the file name) doesn't contain newline characters and doesn't start with a space or tab character:

sed "2~2R$file2" "$file1" < "$file2"

With awk (provided $file1 doesn't contain = characters (or at least that if it does, the part before it is not an acceptable awk variable name)):

export file2
awk '{print}
     NR % 2 == 0 {if ((getline l < ENVIRON["file2"]) > 0) print l}
    ' "$file1"
Related Question