How to merge two files as alternative lines?











up vote
2
down vote

favorite












I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:



file1.txt is



A a aa
B b bb
C c cc
D d dd


and file2.txt is



E e ee 
F f ff


I want to have



A a aa
B b bb
E e ee
C c cc
D d dd
F f ff









share|improve this question
























  • you want the same order u mentioned?? A, B, E, C, D, F??
    – PRATAP
    2 days ago








  • 1




    What to do if lines amount in file1.txt smaller than amount in file2.txt ?
    – S_Flash
    2 days ago










  • Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
    – sudodus
    2 days ago










  • @PRATAP yes, I want the same order of my example.
    – Negar
    yesterday

















up vote
2
down vote

favorite












I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:



file1.txt is



A a aa
B b bb
C c cc
D d dd


and file2.txt is



E e ee 
F f ff


I want to have



A a aa
B b bb
E e ee
C c cc
D d dd
F f ff









share|improve this question
























  • you want the same order u mentioned?? A, B, E, C, D, F??
    – PRATAP
    2 days ago








  • 1




    What to do if lines amount in file1.txt smaller than amount in file2.txt ?
    – S_Flash
    2 days ago










  • Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
    – sudodus
    2 days ago










  • @PRATAP yes, I want the same order of my example.
    – Negar
    yesterday















up vote
2
down vote

favorite









up vote
2
down vote

favorite











I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:



file1.txt is



A a aa
B b bb
C c cc
D d dd


and file2.txt is



E e ee 
F f ff


I want to have



A a aa
B b bb
E e ee
C c cc
D d dd
F f ff









share|improve this question















I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:



file1.txt is



A a aa
B b bb
C c cc
D d dd


and file2.txt is



E e ee 
F f ff


I want to have



A a aa
B b bb
E e ee
C c cc
D d dd
F f ff






text-processing merge






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago









muru

134k19282483




134k19282483










asked 2 days ago









Negar

163




163












  • you want the same order u mentioned?? A, B, E, C, D, F??
    – PRATAP
    2 days ago








  • 1




    What to do if lines amount in file1.txt smaller than amount in file2.txt ?
    – S_Flash
    2 days ago










  • Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
    – sudodus
    2 days ago










  • @PRATAP yes, I want the same order of my example.
    – Negar
    yesterday




















  • you want the same order u mentioned?? A, B, E, C, D, F??
    – PRATAP
    2 days ago








  • 1




    What to do if lines amount in file1.txt smaller than amount in file2.txt ?
    – S_Flash
    2 days ago










  • Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
    – sudodus
    2 days ago










  • @PRATAP yes, I want the same order of my example.
    – Negar
    yesterday


















you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago






you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago






1




1




What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago




What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago












Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago




Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago












@PRATAP yes, I want the same order of my example.
– Negar
yesterday






@PRATAP yes, I want the same order of my example.
– Negar
yesterday












3 Answers
3






active

oldest

votes

















up vote
6
down vote













Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:



$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff




Slightly more long-winded implementation of the same in awk:



awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt





share|improve this answer






























    up vote
    5
    down vote













    You can use the paste command for this:



    % paste -d 'n' - - file2.txt < file1.txt
    A a aa
    B b bb
    E e ee
    C c cc
    D d dd
    F f ff


    paste, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n', we tell it to use newlines as the separator instead. - is standard input, which is redirected in from file1.txt (< file1.txt). So paste takes one line from standard input, then another line from standard input (effectively two lines from file1.txt, then a line from file2.txt and prints them out separated by newlines.






    share|improve this answer





















    • It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
      – Negar
      2 days ago








    • 1




      Can you update your post with such an example?
      – muru
      2 days ago






    • 1




      @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
      – sudodus
      2 days ago












    • @Negar columns or rows? Again, please post a relevant example in your question.
      – muru
      yesterday






    • 1




      @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
      – Negar
      yesterday


















    up vote
    2
    down vote













    Original shellscript



    I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).



    #!/bin/bash

    while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
    do
    echo "$line1"
    echo "$line2"
    echo "$line3"
    done 4<file1.txt 5<file2.txt


    Test



    Make the script executable and run it,



    $ ./script 
    A a aa
    B b bb
    E e ee
    C c cc
    D d dd
    F f ff


    The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).



    Modified shellscript



    The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.



    #!/bin/bash

    end1=false
    end2=false
    cont=true
    while $cont
    do
    read -r -u 4 line1
    if [ $? -eq 0 ]
    then
    echo "$line1"
    else
    end1=true
    fi

    read -r -u 4 line2
    if [ $? -eq 0 ]
    then
    echo "$line2"
    else
    end1=true
    fi

    read -r -u 5 line3
    if [ $? -eq 0 ]
    then
    echo "$line3"
    else
    end2=true
    fi

    if $end1 && $end2 # modify this line to change when to stop
    then
    cont=false
    fi
    done 4<file1.txt 5<file2.txt





    share|improve this answer























      Your Answer








      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "89"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














       

      draft saved


      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1095842%2fhow-to-merge-two-files-as-alternative-lines%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      6
      down vote













      Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:



      $ sed '2~2R file2.txt' file1.txt
      A a aa
      B b bb
      E e ee
      C c cc
      D d dd
      F f ff




      Slightly more long-winded implementation of the same in awk:



      awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt





      share|improve this answer



























        up vote
        6
        down vote













        Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:



        $ sed '2~2R file2.txt' file1.txt
        A a aa
        B b bb
        E e ee
        C c cc
        D d dd
        F f ff




        Slightly more long-winded implementation of the same in awk:



        awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt





        share|improve this answer

























          up vote
          6
          down vote










          up vote
          6
          down vote









          Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:



          $ sed '2~2R file2.txt' file1.txt
          A a aa
          B b bb
          E e ee
          C c cc
          D d dd
          F f ff




          Slightly more long-winded implementation of the same in awk:



          awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt





          share|improve this answer














          Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:



          $ sed '2~2R file2.txt' file1.txt
          A a aa
          B b bb
          E e ee
          C c cc
          D d dd
          F f ff




          Slightly more long-winded implementation of the same in awk:



          awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 2 days ago

























          answered 2 days ago









          steeldriver

          64.7k11102173




          64.7k11102173
























              up vote
              5
              down vote













              You can use the paste command for this:



              % paste -d 'n' - - file2.txt < file1.txt
              A a aa
              B b bb
              E e ee
              C c cc
              D d dd
              F f ff


              paste, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n', we tell it to use newlines as the separator instead. - is standard input, which is redirected in from file1.txt (< file1.txt). So paste takes one line from standard input, then another line from standard input (effectively two lines from file1.txt, then a line from file2.txt and prints them out separated by newlines.






              share|improve this answer





















              • It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
                – Negar
                2 days ago








              • 1




                Can you update your post with such an example?
                – muru
                2 days ago






              • 1




                @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
                – sudodus
                2 days ago












              • @Negar columns or rows? Again, please post a relevant example in your question.
                – muru
                yesterday






              • 1




                @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
                – Negar
                yesterday















              up vote
              5
              down vote













              You can use the paste command for this:



              % paste -d 'n' - - file2.txt < file1.txt
              A a aa
              B b bb
              E e ee
              C c cc
              D d dd
              F f ff


              paste, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n', we tell it to use newlines as the separator instead. - is standard input, which is redirected in from file1.txt (< file1.txt). So paste takes one line from standard input, then another line from standard input (effectively two lines from file1.txt, then a line from file2.txt and prints them out separated by newlines.






              share|improve this answer





















              • It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
                – Negar
                2 days ago








              • 1




                Can you update your post with such an example?
                – muru
                2 days ago






              • 1




                @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
                – sudodus
                2 days ago












              • @Negar columns or rows? Again, please post a relevant example in your question.
                – muru
                yesterday






              • 1




                @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
                – Negar
                yesterday













              up vote
              5
              down vote










              up vote
              5
              down vote









              You can use the paste command for this:



              % paste -d 'n' - - file2.txt < file1.txt
              A a aa
              B b bb
              E e ee
              C c cc
              D d dd
              F f ff


              paste, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n', we tell it to use newlines as the separator instead. - is standard input, which is redirected in from file1.txt (< file1.txt). So paste takes one line from standard input, then another line from standard input (effectively two lines from file1.txt, then a line from file2.txt and prints them out separated by newlines.






              share|improve this answer












              You can use the paste command for this:



              % paste -d 'n' - - file2.txt < file1.txt
              A a aa
              B b bb
              E e ee
              C c cc
              D d dd
              F f ff


              paste, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n', we tell it to use newlines as the separator instead. - is standard input, which is redirected in from file1.txt (< file1.txt). So paste takes one line from standard input, then another line from standard input (effectively two lines from file1.txt, then a line from file2.txt and prints them out separated by newlines.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 2 days ago









              muru

              134k19282483




              134k19282483












              • It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
                – Negar
                2 days ago








              • 1




                Can you update your post with such an example?
                – muru
                2 days ago






              • 1




                @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
                – sudodus
                2 days ago












              • @Negar columns or rows? Again, please post a relevant example in your question.
                – muru
                yesterday






              • 1




                @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
                – Negar
                yesterday


















              • It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
                – Negar
                2 days ago








              • 1




                Can you update your post with such an example?
                – muru
                2 days ago






              • 1




                @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
                – sudodus
                2 days ago












              • @Negar columns or rows? Again, please post a relevant example in your question.
                – muru
                yesterday






              • 1




                @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
                – Negar
                yesterday
















              It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
              – Negar
              2 days ago






              It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
              – Negar
              2 days ago






              1




              1




              Can you update your post with such an example?
              – muru
              2 days ago




              Can you update your post with such an example?
              – muru
              2 days ago




              1




              1




              @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
              – sudodus
              2 days ago






              @Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
              – sudodus
              2 days ago














              @Negar columns or rows? Again, please post a relevant example in your question.
              – muru
              yesterday




              @Negar columns or rows? Again, please post a relevant example in your question.
              – muru
              yesterday




              1




              1




              @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
              – Negar
              yesterday




              @ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
              – Negar
              yesterday










              up vote
              2
              down vote













              Original shellscript



              I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).



              #!/bin/bash

              while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
              do
              echo "$line1"
              echo "$line2"
              echo "$line3"
              done 4<file1.txt 5<file2.txt


              Test



              Make the script executable and run it,



              $ ./script 
              A a aa
              B b bb
              E e ee
              C c cc
              D d dd
              F f ff


              The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).



              Modified shellscript



              The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.



              #!/bin/bash

              end1=false
              end2=false
              cont=true
              while $cont
              do
              read -r -u 4 line1
              if [ $? -eq 0 ]
              then
              echo "$line1"
              else
              end1=true
              fi

              read -r -u 4 line2
              if [ $? -eq 0 ]
              then
              echo "$line2"
              else
              end1=true
              fi

              read -r -u 5 line3
              if [ $? -eq 0 ]
              then
              echo "$line3"
              else
              end2=true
              fi

              if $end1 && $end2 # modify this line to change when to stop
              then
              cont=false
              fi
              done 4<file1.txt 5<file2.txt





              share|improve this answer



























                up vote
                2
                down vote













                Original shellscript



                I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).



                #!/bin/bash

                while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
                do
                echo "$line1"
                echo "$line2"
                echo "$line3"
                done 4<file1.txt 5<file2.txt


                Test



                Make the script executable and run it,



                $ ./script 
                A a aa
                B b bb
                E e ee
                C c cc
                D d dd
                F f ff


                The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).



                Modified shellscript



                The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.



                #!/bin/bash

                end1=false
                end2=false
                cont=true
                while $cont
                do
                read -r -u 4 line1
                if [ $? -eq 0 ]
                then
                echo "$line1"
                else
                end1=true
                fi

                read -r -u 4 line2
                if [ $? -eq 0 ]
                then
                echo "$line2"
                else
                end1=true
                fi

                read -r -u 5 line3
                if [ $? -eq 0 ]
                then
                echo "$line3"
                else
                end2=true
                fi

                if $end1 && $end2 # modify this line to change when to stop
                then
                cont=false
                fi
                done 4<file1.txt 5<file2.txt





                share|improve this answer

























                  up vote
                  2
                  down vote










                  up vote
                  2
                  down vote









                  Original shellscript



                  I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).



                  #!/bin/bash

                  while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
                  do
                  echo "$line1"
                  echo "$line2"
                  echo "$line3"
                  done 4<file1.txt 5<file2.txt


                  Test



                  Make the script executable and run it,



                  $ ./script 
                  A a aa
                  B b bb
                  E e ee
                  C c cc
                  D d dd
                  F f ff


                  The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).



                  Modified shellscript



                  The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.



                  #!/bin/bash

                  end1=false
                  end2=false
                  cont=true
                  while $cont
                  do
                  read -r -u 4 line1
                  if [ $? -eq 0 ]
                  then
                  echo "$line1"
                  else
                  end1=true
                  fi

                  read -r -u 4 line2
                  if [ $? -eq 0 ]
                  then
                  echo "$line2"
                  else
                  end1=true
                  fi

                  read -r -u 5 line3
                  if [ $? -eq 0 ]
                  then
                  echo "$line3"
                  else
                  end2=true
                  fi

                  if $end1 && $end2 # modify this line to change when to stop
                  then
                  cont=false
                  fi
                  done 4<file1.txt 5<file2.txt





                  share|improve this answer














                  Original shellscript



                  I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).



                  #!/bin/bash

                  while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
                  do
                  echo "$line1"
                  echo "$line2"
                  echo "$line3"
                  done 4<file1.txt 5<file2.txt


                  Test



                  Make the script executable and run it,



                  $ ./script 
                  A a aa
                  B b bb
                  E e ee
                  C c cc
                  D d dd
                  F f ff


                  The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).



                  Modified shellscript



                  The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.



                  #!/bin/bash

                  end1=false
                  end2=false
                  cont=true
                  while $cont
                  do
                  read -r -u 4 line1
                  if [ $? -eq 0 ]
                  then
                  echo "$line1"
                  else
                  end1=true
                  fi

                  read -r -u 4 line2
                  if [ $? -eq 0 ]
                  then
                  echo "$line2"
                  else
                  end1=true
                  fi

                  read -r -u 5 line3
                  if [ $? -eq 0 ]
                  then
                  echo "$line3"
                  else
                  end2=true
                  fi

                  if $end1 && $end2 # modify this line to change when to stop
                  then
                  cont=false
                  fi
                  done 4<file1.txt 5<file2.txt






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited yesterday

























                  answered 2 days ago









                  sudodus

                  21.4k32770




                  21.4k32770






























                       

                      draft saved


                      draft discarded



















































                       


                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1095842%2fhow-to-merge-two-files-as-alternative-lines%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                      Alcedinidae

                      Origin of the phrase “under your belt”?